В c # что означает «где T: класс»?


135

В C # что это where T : classзначит?

То есть.

public IList<T> DoThis<T>() where T : class

Ответы:


115

Проще говоря, это ограничение общего параметра классом (или, более конкретно, ссылочным типом, который может быть классом, интерфейсом, делегатом или типом массива).

См. Эту статью MSDN для получения дополнительной информации.


4
Вы пропустили один случай. Аргументом типа для T также может быть любой другой параметр типа, который должен быть ссылочным типом .
Эрик Липперт


35

Это ограничение типа 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предложением или общие ограничения параметров .


5
Можно объединить их вместе, например:where T : class, IComparable, new()
Иззи

17

Это ограничивает Tдля ссылочных типов . Вы не сможете поместить туда типы значений ( structкроме типов s и примитивов string).


Этот ответ (и несколько других с той же информацией) был для меня более полезным, чем выбранный, потому что он дает пример того, чего не может быть T (мне было интересно, что это ограничение фактически добавило к истории)
минут

9

это означает, что тип, используемый Tпри использовании универсального метода, должен быть классом, т. е. он не может быть структурой или встроенным числом типа intилиdouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();

8

where T: class буквально означает это T has to be a class. Это может быть любой ссылочный тип. Теперь , когда любой код вызывает ваш DoThis<T>()метод , который он должен обеспечить класс для замены T . Например, если бы я вызвал ваш DoThis<T>()метод, мне пришлось бы вызывать его следующим образом:

DoThis<MyClass>();

Если ваш метод похож на следующее:

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
 }

4
-1: new T()невозможно с where T : class. Вы должны указать, where T: new()чтобы иметь возможность сделать это.
Esskar

@explorer мы можем определить один универсальный метод и вызывать его из нескольких мест для вставки записи, передавая разные параметры из разных мест.
Закер

4

Это называется ограничением параметра типа. Фактически это ограничивает тип T.

Аргумент типа должен быть ссылочным типом; это относится также к любому классу, интерфейсу, делегату или типу массива.

Ограничения на параметры типа (Руководство по программированию в C #)


4

T представляет собой объектный тип, это означает, что вы можете предоставить любой тип. IList: если IList s = новый IList; Теперь s.add («Всегда принимать строку»).



1

«T» представляет собой общий тип. Это означает, что он может принимать любой тип класса. Следующая статья может помочь:

http://www.15seconds.com/issue/031024.htm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.