Cosa significa & # 8220; dove T: somevalue & # 8221; significare?
-
05-07-2019 - |
Domanda
Cosa significa dove T: somevalue
? Ho appena visto del codice che diceva dove T: Attribute
. Penso che questo abbia a che fare con i generici, ma non sono sicuro di cosa significhi o cosa stia facendo.
Qualcuno lo sa?
Soluzione
È un un vincolo su un parametro di tipo , il che significa che il tipo T
assegnato a una classe o metodo generico deve ereditare dalla classe Attribute
Ad esempio:
public class Foo<T> :
where T : Attribute
{
public string GetTypeId(T attr) { return attr.TypeId.ToString(); }
// ..
}
Foo<DescriptionAttribute> bar; // OK, DescriptionAttribute inherits Attribute
Foo<int> baz; // Compiler error, int does not inherit Attribute
Questo è utile, perché consente alla classe generica di fare cose con oggetti di tipo T
con la consapevolezza che tutto ciò che è un T
deve anche essere un
Nell'esempio sopra, va bene che GetTypeId
richieda il TypeId
di attr
perché TypeId
è un proprietà di un Attributo
e poiché attr
è un T
deve essere un tipo che eredita da Attribute
.
I vincoli possono anche essere usati su metodi generici, con lo stesso effetto:
public static void GetTypeId<T>(T attr) where T : Attribute
{
return attr.TypeId.ToString();
}
Esistono altri vincoli che è possibile inserire in un tipo; da MSDN :
dove T: struct
L'argomento type deve essere un valore genere. Qualsiasi tipo di valore tranne Nullable può essere specificato.
dove T: class
L'argomento type deve essere un riferimento genere; questo vale anche per qualsiasi classe, interfaccia, delegato o tipo di array.
dove T: new ()
L'argomento type deve avere un pubblico costruttore senza parametri. Quando usato insieme ad altri vincoli, il Il vincolo new () deve essere specificato scorso.
dove T: < nome classe base >
L'argomento tipo deve essere o derivare dalla classe base specificata.
dove T: < nome interfaccia >
L'argomento tipo deve essere o implementare l'interfaccia specificata. multiplo i vincoli di interfaccia possono essere specificato. L'interfaccia vincolante può anche essere generico.
dove T: U
L'argomento tipo fornito per T deve essere o derivare dall'argomento fornito per U. Questo si chiama nudo tipo di vincolo.
Altri suggerimenti
Inoltre, ciò che hanno detto gli altri, hai anche quanto segue:
- new () - T deve avere il costruttore predefinito
- class - T deve essere un tipo di riferimento
- struct - T deve essere un tipo di valore
È un modo per limitare il tipo usato come argomenti generici. Quindi:
where T : SomeType
Significa che T deve derivare da SomeType o implementare l'interfaccia SomeType
Il where < La clausola / a> è usata per limitare gli argomenti che possono essere passati quando si usano generici. Quando crei una classe generica, potrebbe essere nel tuo interesse specificare un tipo di argomento a seconda di come prevedi di utilizzare T nella tua classe. Se oltre a ciò che System.Object può fare, probabilmente è meglio usare un vincolo poiché otterrai un errore di tempo di compilazione rispetto a un runtime.
esempio
Se crei una classe
class Person<T> where T : System.IComparable<T>
{
//can now use CompareTo
}
Non puoi passare a questa classe qualsiasi cosa che non implementa IComparable. Quindi ora è sicuro usare CompareTo su tutto ciò che viene passato nella classe Person.