Jared ha menzionato alcuni dei punti; un altro interessante: con i generici, è possibile evitare il pugilato dei tipi di valore finchè in pratica non lo si tocca ... quindi potrei avere uno struct Foo : IMyInterface
e passarlo, e non verrà incassato.
La differenza diventa più evidente con le cose come le collezioni:
static void Foo(IEnumerable<IMyInterface> data) {}
vs
static void Foo<T>(IEnumerable<T> data)
where T : IMyInterface {}
Ora, dal momento che C# 3.0 non dispone di covarianza (tranne che per gli array), non posso passare uno List<Bar>
quello superiore, anche se Bar : IMyInterface
- ma posso con il secondo (implicito T = Bar
).
fonte
2009-02-27 15:49:44
Non è corretto, sta limitando T a essere un IMyInterface. – joshperry
@joshperry, sì ma T continuerà a puntare al tipo effettivo del valore passato. Più precisamente indicherà il tipo di riferimento nel callsite del metodo. Sono sicuro al 100% di essere corretto su questo punto. – JaredPar
Sì, certo che ho interpretato erroneamente la tua affermazione. Chiedo scusa. – joshperry