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.