In c # cosa significa "dove T: class"?


135

In C # cosa where T : classsignifica?

Vale a dire.

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

Risposte:


115

In poche parole, questo sta vincolando il parametro generico a una classe (o più specificamente un tipo di riferimento che potrebbe essere una classe, un'interfaccia, un delegato o un tipo di array).

Vedi questo articolo MSDN per ulteriori dettagli.


4
Hai perso un caso. L'argomento type per T può anche essere qualsiasi altro parametro type vincolato a un tipo di riferimento .
Eric Lippert,

38

È un vincolo di tipo generico . In questo caso significa che il tipo generico Tdeve essere un tipo di riferimento (classe, interfaccia, delegato o tipo di array).


35

È un vincolo di tipo su T, che specifica che deve essere una classe.

La whereclausola può essere utilizzata per specificare altri vincoli di tipo, ad esempio:

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

Per ulteriori informazioni, consultare la pagina MSDN sulla whereclausola o vincoli di parametri generici .


5
È possibile combinarli insieme, ad esempio:where T : class, IComparable, new()
Izzy

17

Ciò si limita Tai tipi di riferimento . Non sarai in grado di inserire lì tipi di valore ( structse stringnon tipi primitivi ).


Questa risposta (e un paio di altre con le stesse informazioni) è stata più utile per me rispetto a quella selezionata, perché fornisce un esempio di ciò che T non può essere (mi chiedevo che cosa questo vincolo effettivamente aggiunto alla storia)
minuti

9

significa che il tipo usato come Tquando viene usato il metodo generico deve essere una classe - cioè non può essere una struttura o un numero incorporato come intodouble

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

8

where T: class significa letteralmente quello T has to be a class. Può essere qualsiasi tipo di riferimento. Ora ogni volta che un codice chiama il tuo DoThis<T>()metodo deve fornire una classe per sostituire T . Ad esempio, se dovessi chiamare il tuo DoThis<T>()metodo, dovrò chiamarlo come segue:

DoThis<MyClass>();

Se il tuo metodo è simile al seguente:

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

   // other uses of T as a type

}

Quindi, ovunque T apparirà nel tuo metodo, verrà sostituito da MyClass. Quindi il metodo finale chiamato dal compilatore sarà simile al seguente:

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()non è possibile con where T : class. devi specificare where T: new()di essere autorizzato a farlo.
Esskar,

@explorer possiamo definire un singolo metodo generico e chiamarlo da più posizioni per inserire un record passando parametri diversi da posizioni diverse.
Zaker,


4

T rappresenta un tipo di oggetto di, implica che puoi dare qualsiasi tipo di. IList: se IList s = nuovo IList; Ora s.add ("Accetta sempre la stringa.").


2

Qui T fa riferimento a una classe, può essere un tipo di riferimento.


1

'T' rappresenta un tipo generico. Significa che può accettare qualsiasi tipo di classe. Il seguente articolo potrebbe aiutare:

http://www.15seconds.com/issue/031024.htm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.