Что означает "where" в объявлении класса С#?
Я попытался это сделать Google, но все, что я мог найти, это документы в обычных объявлениях классов.
public class DataContextWrapper<T> : IDataContextWrapper where T : DataContext, new()
{
}
Я вижу, что класс реализует IDataContextWrapper, наследует от DataContext и изменяется с типом T в зависимости от того, как он создается.
Я не знаю, что может означать "where T
" или ", new()
".
Ответы
Ответ 1
Это общее ограничение и ограничивает, какие типы могут быть переданы в общий параметр.
В вашем случае требуется, чтобы T
был indentical или получен из DataContext
и имеет конструктор по умолчанию (без аргументов) (ограничение new()
).
Вам нужны общие ограничения, чтобы на самом деле сделать что-то нетривиальное с родовым типом.
- Ограничение
new()
позволяет создать экземпляр с new T()
.
- Ограничение
DataContext
позволяет вам вызывать методы DataContext
в экземпляре T
MSDN писал (а):
where T : <base class name>
Аргумент типа должен быть или выводиться из указанного базового класса.
where T : new()
Аргумент типа должен иметь открытый конструктор без параметров. При использовании вместе с другими ограничениями ограничение new() должно быть указано последним.
Ответ 2
Разрешать типы T, которые производны или реализованы DataContext, и иметь открытый конструктор, который не принимает аргументов.
Ответ 3
Это ограничение общего типа и указывает ограничение на общие типы (например, только классы или должен реализовывать определенный интерфейс).
В этом случае T
должен быть классом, который либо является DataContext
, либо наследуется от него, и должен иметь безразмерный публичный конструктор (ограничение new()
).
Ответ 4
Это общее ограничение типа. В этом случае T должен наследовать от DataContext и быть типом с конструктором, который не принимает аргументов.
Ответ 5
где T: DataContext читается как: T должен быть (или получен из a) DataContext
"new()" читается как: должен иметь конструктор без параметров.
Ответ 6
Ключевое слово where
используется для ограничения вашей типичной переменной типа, в вашем случае это означает, что тип T
должен быть DataContext
и должен содержать открытый конструктор по умолчанию.
Ответ 7
Это ограничения в типах, которые могут использоваться как общие. Это дает вам проверки компилятора плюс возможность делать что-то значимое с T.
Т.е. new()
сообщает компилятору, что T должен иметь конструктор без параметров. Это означает, что вы можете создавать экземпляры T путем записи new T();
и, зная, что T также является DataContext, вы можете делать экземпляры T, но также и методы вызова на нем.
Ответ 8
Это ограничение generics.
MSDN имеет больше информации об этом.
См. Ограничения по параметрам типа (Руководство по программированию на С#)
Ответ 9
Где есть ограничение на тип T. Новый говорит, что тип T должен быть реалистичным без каких-либо параметров. т.е. T thing = new T();
Подробнее здесь