2010-04-29 19 views
12

Sto guardando il codice sorgente per il MvcContrib Grid e vedere la classe dichiarata come:Cosa fa la parola chiave "where" in una dichiarazione di classe?

public class Grid<T> : IGrid<T> where T : class 

Che cosa il bit where T : class fare?

+2

possibile duplicato di http://stackoverflow.com/questions/221687/can-you-use-where-to-require-an-attribute-in-c –

+2

@Jon Seigel - sicuramente non è un duplicato di quella domanda. – Oded

risposta

19

È un generic type constraint.

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

Altri vincoli sono elencati here.

È possibile anche limitare il tipo generico di ereditare da un tipo specifico (classe di base o l'interfaccia)

+3

No, non ha nulla a che fare con il fatto di essere derivato da Object. Può essere un'interfaccia o un delegato, per esempio. – Gabe

+0

@Gabe - grazie per la correzione. Risposta aggiornata – Oded

2

Altri esempi possono essere

public A<T> where T : AnInterface 

dove AnInterface è una classe di interfaccia. Significa quindi che lo T deve implementare questa interfaccia.

Questi vincoli sono importanti, in modo che il compilatore conosca le operazioni valide per il tipo. Ad esempio, non è possibile chiamare le funzioni di T senza dire al compilatore quali sono le funzioni fornite dal tipo.

2

È un vincolo sull'argomento del tipo che dice che T può essere una classe o un'interfaccia ma non un enum o una struttura. Quindi T deve essere un tipo di riferimento e non un tipo di valore.

migliori saluti,
Oliver Hanappi

1

è possibile applicare restrizioni ai tipi di tipi che il codice cliente può utilizzare per argomenti di tipo quando si crea un'istanza della classe sono chiamati come Constraints on Type Parameters

Ad esempio: dove T: classe

Qui dove T è il tipo, l'argomento tipo deve essere un tipo di riferimento; questo vale anche per qualsiasi classe, interfaccia, delegato o tipo di matrice.

1

È un vincolo di tipo generico. Specifica che il tipo T deve essere un tipo di riferimento, vale a dire una classe e non una struttura.

Problemi correlati