Почему Nullable<T> не совпадает как ссылочный тип для общих ограничений
Возможный дубликат:
Обнуляемый тип как универсальный параметр возможно?
Я столкнулся с очень странной вещью с общими ограничениями типов. У меня есть такой класс:
public SomeClass<T> where T:class
{
}
Тем не менее, я обнаружил, что не могу использовать обнуляемые типы, как я ожидал:
new SomeClass<int?>();
Я получаю сообщение об ошибке int?
должен быть ссылочным типом. Действительно ли Nullable - это просто структура с синтаксическим сахаром, чтобы он выглядел как ссылочный тип?
1 ответ
Nullable<T>
это struct
(см. MSDN), однако это единственный struct
это не удовлетворяет struct
ограничение. Поэтому вы не можете использовать Nullable
в качестве параметра общего типа, когда либо class
или же struct
ограничения используются.
Nullable<T>
это не просто структура с синтетическим сахаром. Он имеет специальную поддержку в CLR для некоторых из его поведения. Например, у него есть специальное поведение в боксе. В частности, обнуляемый никогда не в штучной упаковке. Основное значение в штучной упаковке. Если nullable является нулевым значением (HasValue равно false), то оно преобразуется в нулевую ссылку. Также операторы конвертации для любых Nullable<T>
в Nullable<U>
снимаются с обращений из T
в U
, Это функции, которые вы не сможете реализовать в.NET 1.0/1.1.