Почему Nullable <T> не соответствует ссылочному типу для общих ограничений

Возможный дубликат:
Нулевый тип в качестве общего параметра возможен?

Я встретил очень странную вещь с ограничениями общего типа. У меня есть класс вроде этого:

public SomeClass<T> where T:class
{
}

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

new SomeClass<int?>();

Я получаю сообщение об ошибке, что int? должен быть ссылочным типом. Является ли Nullable действительно просто структурой с синтаксическим сахаром, чтобы он выглядел как ссылочный тип?

Ответ 1

Nullable<T> является struct (см. MSDN), однако это единственный struct, который не удовлетворяет struct. Поэтому при использовании ограничений class или struct нельзя использовать параметр Nullable в качестве параметра общего типа.

Nullable<T> - это не просто структура с некоторым синтаксическим сахаром. Он имеет особую поддержку в CLR для некоторых своих действий. Например, он имеет особое поведение в боксе. В частности, значение nullable никогда не помещается в коробку. Базовое значение в коробке. Если nullable - это нулевое значение (HasValue - false), то оно преобразуется в нулевую ссылку. Кроме того, операторы преобразования для любых Nullable<T> до Nullable<U> снимаются с преобразований от T до U. Эти функции вы не сможете реализовать в .NET 1.0/1.1.