W c # co oznacza „gdzie T: klasa”?

140

W C # co to where T : classznaczy?

To znaczy.

public IList<T> DoThis<T>() where T : class
Makach
źródło

Odpowiedzi:

117

Mówiąc najprościej, ogranicza to ogólny parametr do klasy (lub dokładniej do typu referencyjnego, który może być klasą, interfejsem, delegatem lub typem tablicy).

Więcej informacji można znaleźć w tym artykule MSDN .

Andy Rose
źródło
4
Przegapiłeś jedną sprawę. Argument typu dla T może być również dowolnym innym parametrem typu, który jest ograniczony do typu referencyjnego .
Eric Lippert
Nie można jej wybrać jako odpowiedzi.
Clint Eastwood
39

Jest to ograniczenie typu T, określające, że musi to być klasa.

whereKlauzula może być użyta do określenia innych ograniczeń typu, np:

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

Aby uzyskać więcej informacji, sprawdź stronę MSDN dotyczącą whereklauzuli lub ogólnych ograniczeń parametrów .

Pączek
źródło
5
Można je ze sobą łączyć, np .:where T : class, IComparable, new()
Izzy
37

Jest to ogólne ograniczenie typu . W tym przypadku oznacza to, że typ ogólny Tmusi być typem referencyjnym (typem klasy, interfejsu, delegata lub tablicy).

Oded
źródło
16

To ogranicza się Tdo typów referencyjnych . Nie będzie można tam umieszczać typów wartości ( structz wyjątkiem typów pierwotnych i typów string).

Vilx-
źródło
Ta odpowiedź (i kilka innych z tymi samymi informacjami) była dla mnie bardziej przydatna niż wybrana, ponieważ daje przykład tego, czym nie może być T (zastanawiałem się, co to ograniczenie faktycznie dodaje do historii)
min
8

oznacza to, że typ używany jako Tmetoda ogólna musi być klasą - tj. nie może być strukturą ani liczbą wbudowaną, jak intlubdouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
Isak Savo
źródło
8

where T: class dosłownie to znaczy T has to be a class. Może to być dowolny typ odniesienia. Teraz, gdy dowolny kod wywołuje swoją DoThis<T>()metodę musi dostarczyć klasę zastąpić T . Na przykład, gdybym miał wywołać twoją DoThis<T>()metodę, będę musiał to wywołać w następujący sposób:

DoThis<MyClass>();

Jeśli twoja metoda jest podobna do poniższej:

public IList<T> DoThis<T>() where T : class
{
   T variablename = new T();

   // other uses of T as a type

}

Wtedy wszędzie tam, gdzie w Twojej metodzie pojawi się T, zostanie zastąpione przez MyClass. Zatem ostatnia metoda wywoływana przez kompilator będzie wyglądać następująco:

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
 }
poszukiwacz
źródło
4
-1: new T()nie jest możliwe z where T : class. musisz określić, where T: new()czy chcesz to zrobić.
esskar
@explorer możemy zdefiniować jedną ogólną metodę i wywołać ją z wielu miejsc, aby wstawić rekord, przekazując różne parametry z różnych miejsc.
Zaker
3

T reprezentuje typ obiektu, oznacza to, że możesz podać dowolny typ. IList: jeśli IList s = new IList; Teraz s.add ("Zawsze akceptuj ciąg.").

AsifQadri
źródło
1

Tutaj T odnosi się do Class, może to być typ referencyjny.

Hemant Kumar
źródło
0

„T” reprezentuje typ ogólny. Oznacza to, że może przyjmować dowolny typ zajęć. Poniższy artykuł może pomóc:

http://www.15seconds.com/issue/031024.htm
Randy Minder
źródło