"T: class" costringerà il tipo generico specificato a essere una classe, non un valore. Ad esempio, siamo in grado di comporre una classe ObjectList che richiede il tipo generico specificato di essere una classe, non un valore:
class ObjectList<T> where T : class {
...
}
class SomeObject { ... }
ObjectList<int> invalidList = new ObjectList<int>(); //compiler error
ObjectList<SomeObject> someObjectList = new ObjectList<SomeObject>(); //this works
Questo costringe un invariante sul tipo generico T che altrimenti potrebbero non essere applicabili. "T: struct" avrebbe funzionato allo stesso modo. Si noti che è possibile utilizzare questo costrutto anche per applicare non solo il tipo T alla classe, ma anche la corrispondenza con un'interfaccia. L'esempio di codice ho preso questo da anche ha
class MyList<T> where T : class, IEntity { ... }
che costringe T per essere una classe e anche essere un IEntity.
fonte
2011-01-19 10:16:30
Grazie , ma sono consapevole della semantica dei vincoli generici - quello che sto chiedendo sono esempi in cui i vincoli struct/class sono * utili *. – Oak