Was bedeutet in c # 'wo T: Klasse'?

135

Was bedeutet in C # where T : class?

Dh.

public IList<T> DoThis<T>() where T : class
Makach
quelle

Antworten:

115

Einfach ausgedrückt bedeutet dies, dass der generische Parameter auf eine Klasse beschränkt wird (oder genauer gesagt auf einen Referenztyp, der eine Klasse, eine Schnittstelle, ein Delegat oder ein Array-Typ sein kann).

Weitere Informationen finden Sie in diesem MSDN-Artikel .

Andy Rose
quelle
4
Sie haben einen Fall verpasst. Das Typargument für T kann auch ein beliebiger anderer Typparameter sein, der auf einen Referenztyp beschränkt ist .
Eric Lippert
38

Es ist eine generische Typeinschränkung . In diesem Fall bedeutet dies, dass der generische Typ Tein Referenztyp sein muss (Klasse, Schnittstelle, Delegat oder Array-Typ).

Oded
quelle
35

Dies ist eine Typbeschränkung T, die angibt, dass es sich um eine Klasse handeln muss.

Die whereKlausel kann verwendet werden, um andere Typeinschränkungen anzugeben, z.

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

Weitere Informationen finden Sie auf der MSDN-Seite zur whereKlausel oder unter allgemeinen Parametereinschränkungen .

Krapfen
quelle
5
Es ist möglich, diese miteinander zu kombinieren, zB:where T : class, IComparable, new()
Izzy
17

Das beschränkt sich Tauf Referenztypen . Sie können dort keine Werttypen ( structaußer s und primitiven Typen string) einfügen.

Vilx-
quelle
Diese Antwort (und ein paar andere mit den gleichen Informationen) war nützlich für mich als die ausgewählt, weil es ein Beispiel dafür , was T gibt kann nicht sein (ich frage mich , was diese Einschränkung auf die Geschichte tatsächlich hinzugefügt)
Min
9

Dies bedeutet, dass der Typ, der Tbei Verwendung der generischen Methode verwendet wird, eine Klasse sein muss - dh es kann keine Struktur oder eingebaute Zahl wie intoder seindouble

// Valid:
var myStringList = DoThis<string>();
// Invalid - compile error
var myIntList = DoThis<int>();
Isak Savo
quelle
8

where T: class bedeutet wörtlich das T has to be a class. Es kann ein beliebiger Referenztyp sein. Wenn ein Code Ihre DoThis<T>()Methode aufruft , muss er eine Klasse bereitstellen, um T zu ersetzen . Wenn ich zum Beispiel Ihre DoThis<T>()Methode aufrufen würde, müsste ich sie wie folgt aufrufen:

DoThis<MyClass>();

Wenn Ihre Methode wie folgt aussieht:

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

   // other uses of T as a type

}

Wo immer T in Ihrer Methode erscheint, wird es durch MyClass ersetzt. Die endgültige Methode, die der Compiler aufruft, sieht also wie folgt aus:

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
 }
Forscher
quelle
4
-1: new T()ist nicht möglich mit where T : class. Sie müssen angeben where T: new(), um dies tun zu dürfen.
Esskar
@explorer können wir eine einzelne generische Methode definieren und von mehreren Stellen aus aufrufen, um einen Datensatz einzufügen, indem wir verschiedene Parameter von verschiedenen Stellen übergeben.
Zaker
4

T stellt einen Objekttyp von dar. Dies bedeutet, dass Sie einen beliebigen Typ von angeben können. IList: wenn IList s = neuer IList; Jetzt s.add ("String immer akzeptieren.").

AsifQadri
quelle
2

Hier bezieht sich T auf eine Klasse. Es kann ein Referenztyp sein.

Hemant Kumar
quelle
1

'T' steht für einen generischen Typ. Dies bedeutet, dass jede Art von Klasse akzeptiert werden kann. Der folgende Artikel könnte helfen:

http://www.15seconds.com/issue/031024.htm
Randy Minder
quelle