Вы задаете 2 разных вопроса
Все ли типы справочных классов в C#?
Нет
ограничение в следующем шаблоне c [where T : class
] включает все ссылочные типы?
Да, оно будет ограничивать все ссылочные типы
Во-первых, , давайте определим, что на самом деле является типом ссылки .
Типы ссылок (C# Reference)
Существует два вида типов в C#: ссылочные типы и типы значений . Переменные ссылочных типов хранят ссылки на свои данные (объекты), в то время как переменные типов значений непосредственно содержат их данные.
Следующие ключевые слова используются для объявления ссылочных типов:
C# также имеет следующие встроенные ссылочные типы:
Примечание : не упомянуто выше, Array
типы также являются ссылочными типами, полученными из abstract
базового типа Array
Во-вторых , давайте выясним, что ограничивает класс
Ограничения на параметры типа (C# Руководство по программированию )
where T : class
Аргумент типа должен быть ссылочным типом. Это ограничение распространяется также на любой класс , интерфейс , делегат или тип массива .
Примечание : Не упомянуто выше, ограничение class
также включает dynamic
В качестве бонуса, начиная с C# 7,3 Вы также можете явно ограничить с помощью делегат
Ограничения делегирования
Также начинаются с C# 7.3 , вы можете использовать System.Delegate
или System.MulticastDelegate
в качестве ограничения базового класса. CLR всегда допускал это ограничение, но язык C# запрещал его