В 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окрім примітивних та типових типів string).


Ця відповідь (і пара інших з тією ж інформацією) була для мене більш корисною, ніж обрана, тому що вона дає приклад того, чого Т не може бути (мені було цікаво, що це обмеження насправді додало до історії)
хв.

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.