Почему 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.

Другие вопросы по тегам