Все ли ссылочные типы типов классов в C#? - PullRequest
3 голосов
/ 08 февраля 2020

Есть ли в C# какой-либо ссылочный тип, который не является классом? включает ли ограничение в следующем шаблоне c все ссылочные типы?

static void f<T>() where T : class
{
    T t = default;
    Console.WriteLine(t);
}

1 Ответ

6 голосов
/ 08 февраля 2020

Вы задаете 2 разных вопроса

Все ли типы справочных классов в C#?

Нет

ограничение в следующем шаблоне c [where T : class] включает все ссылочные типы?

Да, оно будет ограничивать все ссылочные типы


Во-первых, , давайте определим, что на самом деле является типом ссылки .

Типы ссылок (C# Reference)

Существует два вида типов в C#: ссылочные типы и типы значений . Переменные ссылочных типов хранят ссылки на свои данные (объекты), в то время как переменные типов значений непосредственно содержат их данные.

Следующие ключевые слова используются для объявления ссылочных типов:

  • класс

  • интерфейс

  • делегат

C# также имеет следующие встроенные ссылочные типы:

  • Dynami c

  • объект

  • строка

Примечание : не упомянуто выше, Array типы также являются ссылочными типами, полученными из abstract базового типа Array

Во-вторых , давайте выясним, что ограничивает класс

Ограничения на параметры типа (C# Руководство по программированию )

where T : class

Аргумент типа должен быть ссылочным типом. Это ограничение распространяется также на любой класс , интерфейс , делегат или тип массива .

Примечание : Не упомянуто выше, ограничение class также включает dynamic


В качестве бонуса, начиная с C# 7,3 Вы также можете явно ограничить с помощью делегат

Ограничения делегирования

Также начинаются с C# 7.3 , вы можете использовать System.Delegate или System.MulticastDelegate в качестве ограничения базового класса. CLR всегда допускал это ограничение, но язык C# запрещал его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...