Подтвердить что ты не робот

Путаница относительно ограничений Nullable <T>

Приветствую всех. Прошу прощения, если об этом уже спрашивали (искал напрасно) или действительно очень просто, но я просто не могу его получить. Определение

4b9b3361

Ответ 1

Я думаю, что это просто ошибка в документации. Если вы посмотрите на тип Nullable<T> в рефлекторе или с помощью команды "Перейти к определению" в VS, он отображает только ограничение struct.


ИЗМЕНИТЬ

Я снова об этом думал, и я сделал небольшое испытание:

var attributes = typeof(Nullable<>).GetGenericArguments()[0].GenericParameterAttributes;
Console.WriteLine(attributes);

Этот код производит следующий вывод:

NotNullableValueTypeConstraint, DefaultConstructorConstraint

Таким образом, согласно отражению, T in Nullable<T> имеет ограничение new()... Это означает, что, хотя он и недействителен в С#, он должен быть действительным для CLR.

Итак, документация правильная и неправильная: это правда, что T in Nullable<T> имеет ограничение по умолчанию для конструктора, но объявление С#, которое оно показывает, неверно...

Это на самом деле не очень удивительно, так как документация создается из метаданных сборки (и, конечно, XML-комментариев). Должна быть ошибка в генераторе документации...

Ответ 2

С# требует, чтобы типы значений имели стандартные конструкторы по умолчанию, но CLR этого не делает.

Если вы определили тип на языке, который поддерживал определение структуры этого типа (я считаю, что С++/CLI допускает это), будет иметь место двусмысленность относительно того, когда он вызывается.

Ответ 3

Если вы посмотрите на разборку ИЛ, вы увидите, что у нее есть ограничение конструктора:

.class public sequential ansi serializable sealed beforefieldinit Nullable<valuetype (System.ValueType) .ctor T>

Если документация создается непосредственно из метаданных сборки, возможно, это причина?