2011-01-03 3 views
19

Я попытался это сделать, но все, что я мог найти, это документы на обычные объявления классов.Что означает «где» в объявлении класса C#?

public class DataContextWrapper<T> : IDataContextWrapper where T : DataContext, new() 
{ 

} 

Я понимаю, что класс реализует IDataContextWrapper, наследует от DataContext и варьируется в зависимости от типа Т в зависимости от того, как его экземпляра.

Я не знаю, что такое «where T» или «, new()».

+7

Рассмотрим чтение # спецификации C, когда у вас есть вопросы относительно синтаксиса языка; это довольно подробно. –

ответ

38

Это generic constraint и ограничивает, какие типы могут быть переданы в общий параметр.

В вашем случае это требует, чтобы T был индентичен или получен из DataContext и имеет конструктор по умолчанию (без аргументов) (ограничение new()).

Вам нужны общие ограничения, чтобы на самом деле сделать что-то не тривиальное с общим типом.

  • Ограничение на new() позволяет создать экземпляр с new T().
  • DataContext ограничение позволяет вызывать методы DataContext на примере T

MSDN писал:

where T : <base class name> Тип аргумент должен быть или вывести из указанного базового класса.

where T : new() Аргумент типа должен иметь открытый конструктор без параметров. При использовании вместе с другими ограничениями ограничение new() должно быть указано последним.

+1

+1, но где T: класс отличается от T: SomeClassName, поэтому первая часть фрагмента MSDN не относится к OP. – KeithS

+0

@ KeithS упс, исправлено – CodesInChaos

+0

@CodeInChaos - Отличный ответ. Мне любопытно, почему, зачем кому-то указывать фактический тип (например, где T: DataContext). Весь смысл дженериков - указать тип во время выполнения. –

13

Разрешите типы T, которые производны или реализованы DataContext, и имеют открытый конструктор, который не принимает аргументов.

+1

'T' также должен представлять не абстрактный тип. Это важно, потому что законно называть 'new T()', когда было введено ограничение 'new()'. Кроме того, если 'DataContext' является классом,' T' * может * быть 'DataContext' сам (а не получен из него). – Ani

5

Это общее ограничение типа. В этом случае T должен наследовать от DataContext и быть типом с конструктором, который не принимает аргументов.

+3

Это не обязательно ссылочный тип. 'new()' применяется также к структурам. –

+0

Спасибо. Я исправил свой ответ. –

4

, где T: DataContext читается как: T должен быть (или получен из a) DataContext «, new()» читается как: должен иметь конструктор без параметров.

9

Это generic type constraint и указывает ограничение на общие типы (например, только классы или должен реализовывать определенный интерфейс).

В этом случае T должен быть классом, который является либо DataContext, либо наследуется от него и должен иметь безкомпоновый публичный конструктор (ограничение new()).

4

Ключевое слово where используется для ограничения вашей общей переменной типа, в вашем случае это означает, что тип T должен быть DataContext и должен содержать открытый конструктор по умолчанию.

+0

Это должно быть «* must * содержать общедоступный конструктор по умолчанию» – Richard

+0

Да, это правда :). –

2

Это ограничения типов, которые могут использоваться как общие. Это дает вам проверки компилятора плюс возможность делать что-то значимое с T.

Т.е. new() сообщает компилятору, что T должен иметь конструктор без параметров. Это означает, что вы можете создавать экземпляры T путем записи new T(); и, зная, что T также является DataContext, вы можете делать экземпляры T, но также и методы вызова на нем.

2

Где там накладывать ограничения на тип Т. нового говорит о том, что тип Т должен быть инстанциируемый без каких-либо параметров. т.е. T thing = new T();

Подробнее here