Беспорядок о Nullable <T> ограничения

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

[SerializableAttribute]
public struct Nullable
where T : struct, new()

Таким образом, вопрос довольно прост: Как это определение возможно? Или это - просто опечатка? Каждый тип значения уже имеет конструктора по умолчанию. Действительно, когда я пытаюсь скомпилировать что-то вроде этого, в компиляторе обоснованно говорится, что это недопустимо для применения обоих ограничений одновременно, потому что второй неявно включен в первый.

Заранее спасибо.

10
задан n535 7 April 2010 в 21:59
поделиться

3 ответа

Я думаю, это просто ошибка в документации. Если вы посмотрите на тип 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). Должна быть ошибка в генераторе документации ...

12
ответ дан 3 December 2019 в 19:32
поделиться

C # требует, чтобы типы значений имели общедоступные конструкторы по умолчанию, а в CLR их нет.

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

5
ответ дан 3 December 2019 в 19:32
поделиться

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

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

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

3
ответ дан 3 December 2019 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: