2010-09-24 14 views

risposta

83

poche parole questa è vincolante la parametro generico per una classe (o più specificamente un tipo di riferimento che potrebbe essere una classe, un'interfaccia, un delegato o un tipo di matrice).

Vedere questo MSDN article per ulteriori dettagli.

+2

Hai perso un caso. L'argomento di tipo per T può anche essere * qualsiasi altro parametro di tipo che è vincolato ad essere un tipo di riferimento *. –

+0

Upvoted per il collegamento MSDN fornito. è molto utile – SaddamBinSyed

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 
34

È un generic type constraint. In questo caso significa che il tipo generico T deve essere un tipo di riferimento (classe, interfaccia, delegato o tipo di matrice).

8

significa che il tipo utilizzato come T quando il metodo generico viene utilizzato deve essere una classe - cioè non può essere una struttura o costruito nel numero come int o double

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

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

La clausola where può essere utilizzato per specificare altri vincoli di tipo, ad es .:

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 di MSDN sul where clause o generic parameter constraints.

+3

È possibile combinarli insieme, ad esempio: 'dove T: class, IComparable, new()' – Izzy

13

Ciò limita i tipi di riferimento T a . Lì non sarà possibile inserire tipi di valore (struct s e tipi primitivi eccetto string).

4

T rappresenta un tipo di oggetto di, implica che si può dare qualsiasi tipo di. IList: if IList s = new IList; Ora s.add ("Accetta sempre stringa.").

5

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

DoThis<MyClass>(); 

Se il metthod è come come la seguente:

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

    // other uses of T as a type 

} 

Allora dove mai T appare nella vostra metodo, sarà sostituito da MyClass. Così l'ultimo metodo che le chiamate compilatore, avrà un aspetto 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 
} 
+3

-1: 'new T()' non è possibile con 'where T: class'. devi specificare 'dove T: new()' per poterlo fare. – esskar

+0

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

2

Qui T si riferisce ad un Class.It può essere un tipo di riferimento.