"T: clase" forzará que el tipo genérico especificado sea una clase, no un valor. Por ejemplo, podemos compensar una clase ObjectList que requiere el tipo genérico especificado a ser una clase, no es un valor:
class ObjectList<T> where T : class {
...
}
class SomeObject { ... }
ObjectList<int> invalidList = new ObjectList<int>(); //compiler error
ObjectList<SomeObject> someObjectList = new ObjectList<SomeObject>(); //this works
Esto obliga a un invariante en su tipo T genérica que de otro modo podrían no ser ejecutable. "T: struct" funcionaría de la misma manera. Tenga en cuenta que también puede usar esta construcción para exigir no solo que el tipo T sea una clase, sino también que coincida con una interfaz. La muestra del código que tomé esto también tiene
class MyList<T> where T : class, IEntity { ... }
que fuerza a T a ser una clase Y también ser un IEntity.
Gracias , pero soy consciente de la semántica de las restricciones genéricas; lo que estoy pidiendo son ejemplos en los que las restricciones struct/class sean * useful *. – Oak