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

135

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

То есть.

public IList<T> DoThis<T>() where T : class
Махач
источник

Ответы:

115

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

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

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

Это ограничение общего типа . В этом случае это означает, что универсальный тип 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).

Vilx-
источник
Этот ответ (и несколько других с той же информацией) был для меня более полезным, чем выбранный, потому что он дает пример того, чего не может быть 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 #)

Carlos
источник
4

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

AsifQadri
источник
2

Здесь T относится к классу. Это может быть ссылочный тип.

Хемант Кумар
источник
1

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

http://www.15seconds.com/issue/031024.htm
Рэнди Миндер
источник