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?

È stato utile?

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 attributo .

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top