«T: class» заставит общий тип, указанный как класс, а не значение. Например, мы можем составить в ObjectList класс, который требует общего типа, указанного быть классом, а не значение:
class ObjectList<T> where T : class {
...
}
class SomeObject { ... }
ObjectList<int> invalidList = new ObjectList<int>(); //compiler error
ObjectList<SomeObject> someObjectList = new ObjectList<SomeObject>(); //this works
Это заставляет инвариант на вашем шаблонном типе T, что в противном случае не может быть законной силой. «T: struct» будет работать одинаково. Обратите внимание, что вы также можете использовать эту конструкцию для принудительного применения не только того, что тип T является классом, но также и того, что он соответствует интерфейсу. Образец кода, который я взял, также имеет
class MyList<T> where T : class, IEntity { ... }
Спасибо , но я знаю семантику общих ограничений - то, о чем я прошу, является примерами, где ограничения struct/class * полезны *. – Oak