"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 { ... }
, что заставляет T быть классом и также быть IEntity.