vi consiglio di evitare i tipi generici dove le opere di sintassi non generici, come l'esempio che ha dato. Tuttavia, ci sono altri casi utili.
Ad esempio, specificando il tipo di ritorno genericamente:
static T Create<T>() where T: Sample, new()
{
return new T();
}
// Calling code
Sample sample = Create<Sample>();
invece di
static object Create()
{
return new Sample();
}
// Calling code
Sample sample = (Sample) Create();
È inoltre possibile utilizzare i modelli per posizionare più restrizioni su un tipo. Ad esempio:
static T Create<T>() where T: IMyInterface, new()
{
return new T();
}
interface IMyInterface {}
class MyClass : IMyInterface { }
// Calling code.
MyClass myClass = Create<MyClass>();
Questo permette la creazione generico di un nuovo tipo che implementa un'interfaccia specifica e ha un costruttore generico. Inoltre:
static void DoSomething<T>(T t) where T: IMyInterface1, IMyInterface2
{
t.MethodOnIMyInterface1();
t.MethodOnIMyInterface2();
}
interface IMyInterface1
{
void MethodOnIMyInterface1();
}
interface IMyInterface2
{
void MethodOnIMyInterface2();
}
class MyClass: IMyInterface1, IMyInterface2
{
// Method implementations omitted for clarity
}
// Calling code
MyClass myclass'
DoSomething(myclass); // Note that the compiler infers the type of T.
Dove è possibile richiedere più interfacce su un singolo parametro senza (1) la creazione di un nuovo tipo che implementa tutte queste interfacce e (2) richiedendo parametri di essere di quel tipo.
Come dice @dcastro nella sua risposta, i tipi generici possono anche indicare al compilatore di richiedere che i tipi siano gli stessi. Ad esempio:
static void DoSomething<T>(T t1, T t2) where T: MyType
{
// ...
}
class MyType {}
class MyType1: MyType {}
class MyType2: MyType {}
// Calling code
MyType1 myType1;
MyType2 myType2;
DoSomething<MyType>(myType1, myType2);
Dove il compilatore richiede che t1 e t2 sono dello stesso tipo, ma possono essere di qualsiasi tipo che eredita MyType
. Questo è utile nei framework di test unitari automatici, come NUnit o MSTest, per controlli di uguaglianza e confronto generici.
Per le cose passate ai metodi, il vantaggio è davvero piuttosto ridotto. Per le cose che vengono restituite di nuovo aiuta un po 'di più perché il consumatore non ha bisogno di trasmettere. – Joey