Приветствую всех. Прошу прощения, если об этом уже спрашивали (искал напрасно) или действительно очень просто, но я просто не могу его получить. Определение
Путаница относительно ограничений Nullable <T>
Ответ 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>
Если документация создается непосредственно из метаданных сборки, возможно, это причина?