Поздравления все. Я сожалею, если это уже спросили прежде (искавшее напрасно) или действительно очень просто, но я просто не могу получить его. Определение MSDN типа Nullable, состояний, что это определяется следующим способом:
[SerializableAttribute]
public struct Nullable
where T : struct, new()
Таким образом, вопрос довольно прост: Как это определение возможно? Или это - просто опечатка? Каждый тип значения уже имеет конструктора по умолчанию. Действительно, когда я пытаюсь скомпилировать что-то вроде этого, в компиляторе обоснованно говорится, что это недопустимо для применения обоих ограничений одновременно, потому что второй неявно включен в первый.
Заранее спасибо.
Я думаю, это просто ошибка в документации. Если вы посмотрите на тип Nullable
в Reflector или с помощью команды «Перейти к определению» в VS, он покажет только ограничение struct
.
РЕДАКТИРОВАТЬ
Я снова подумал об этом и провел небольшой тест:
var attributes = typeof(Nullable<>).GetGenericArguments()[0].GenericParameterAttributes;
Console.WriteLine(attributes);
Этот код дает следующий результат:
NotNullableValueTypeConstraint, DefaultConstructorConstraint
Итак, согласно размышлениям, T
в Nullable
имеет ли ограничение new ()
... Это означает, что даже если оно недопустимо в C #, оно должно быть действительным для CLR .
Таким образом, документация верна и неверна: верно, что T
в Nullable
имеет ограничение «конструктор по умолчанию», но показываемое в нем объявление C # неверно. ...
На самом деле это не очень удивительно, поскольку документация генерируется из метаданных сборки (и, конечно, комментариев XML). Должна быть ошибка в генераторе документации ...
C # требует, чтобы типы значений имели общедоступные конструкторы по умолчанию, а в CLR их нет.
Если вы определили тип на языке, который поддерживает определение структуры этого типа (я считаю, что C ++ / CLI это допускает), возникнет двусмысленность относительно того, когда он вызывается.
Если вы посмотрите на разборку IL, вы увидите, что у нее есть ограничение конструктора:
.class public sequential ansi serializable sealed beforefieldinit Nullable<valuetype (System.ValueType) .ctor T>
Если документация создается непосредственно из метаданных сборки, может быть, это причина?