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

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 .


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 .


5
Można je ze sobą łączyć, np .:where T : class, IComparable, new()
Izzy


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).


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>();

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
 }

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.").



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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.