В С#, что означает where T : class
?
Т.е.
public IList<T> DoThis<T>() where T : class
В С#, что означает where T : class
?
Т.е.
public IList<T> DoThis<T>() where T : class
Проще говоря, это ограничивает общий параметр классом (или, более конкретно, ссылочным типом, который может быть классом, интерфейсом, делегатом или типом массива).
Подробнее см. статью MSDN.
Это ограничение общего типа. В этом случае это означает, что общий тип T
должен быть ссылочным типом (класс, интерфейс, делегат или тип массива).
Это ограничение типа на T
, указывая, что это должен быть класс.
Предложение where
может использоваться для указания других ограничений типа, например:
where T : struct // T must be a struct
where T : new() // T must have a default parameterless constructor
where T : IComparable // T must implement the IComparable interface
Для получения дополнительной информации посетите страницу MSDN в разделе where
или общие ограничения параметров.
Это ограничивает T
ссылочными типами. Вы не сможете разместить типы значений (struct
и примитивные типы, кроме string
) там.
это означает, что тип, используемый как T
, когда общий метод используется, должен быть классом - то есть он не может быть строкой или встроенным числом, например int
или double
// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
where T: class
буквально означает, что T has to be a class
. Это может быть любой ссылочный тип. Теперь, когда какой-либо код вызывает ваш метод DoThis<T>()
, он должен предоставить класс для замены T. Например, если бы я должен был вызвать ваш метод DoThis<T>()
, тогда мне придется называть его следующим:
DoThis<MyClass>();
Если ваше metthod похоже на следующее:
public IList<T> DoThis<T>() where T : class
{
T variablename = new T();
// other uses of T as a type
}
Затем, когда T появляется в вашем методе, он будет заменен MyClass. Таким образом, окончательный метод, который вызывает компилятор, будет выглядеть следующим образом:
public IList<MyClass> DoThis<MyClass>()
{
MyClass variablename= new MyClass();
//other uses of MyClass as a type
// all occurences of T will similarly be replace by MyClass
}
Он называется ограничением параметра типа. Фактически это ограничивает тип T.
Аргумент типа должен быть ссылкой тип; это относится и к любому классу, интерфейса, делегата или массива.
Ограничения по параметрам типа (Руководство по программированию на С#)
T представляет собой тип объекта, это означает, что вы можете дать любой тип. IList: если IList s = новый IList; Теперь s.add( "Всегда принимать строку." ).
'T' представляет общий тип. Это означает, что он может принимать любой тип класса. Следующая статья может помочь:
http://www.15seconds.com/issue/031024.htm
Здесь T относится к классу. Он может быть ссылочным типом.