Является ли компилятор С# оптимизирующим типы с нулевым значением?
Может ли кто-нибудь пролить свет на то, почему этот unit test не работает в Visual Studio 2013?
[TestMethod]
public void Inconceivable()
{
int? x = 0;
Assert.AreEqual(typeof(int?), x.GetType());
}
Ответ 1
Тест не работает, потому что:
Вызов GetType по типу Nullable вызывает операцию бокса, когда тип неявно преобразован в Object. Поэтому GetType всегда возвращает объект Тип, который представляет базовый тип, а не тип Nullable.
int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"
Также обратите внимание:
Оператор С# is также работает с базовым типом Nullable. Поэтому вы не можете использовать , чтобы определить, является ли переменная типом Nullable. В следующем примере показано, что оператор рассматривает Nullable <int> переменная как int.
int? i = 5;
if (i is int) { ... } // true
Вы правы, полагая, что компилятор С# оптимизирует типы с нулевым значением. Здесь цитата из Jon Skeet С# в глубине, которая должна ответить на ваш вопрос:
Только для бокса и распаковки, которые CLR имеет любое особое поведение в отношении типов с нулевым значением. Фактически, поведение было изменено незадолго до выпуска .NET 2.0 в результате запросов сообщества.
Экземпляр Nullable помещается в поле для нулевой ссылки (если она не имеет значения) или значение в коробке T (если оно есть). Он никогда не привязывается к "коробке с нулевым значением int" - нет такого типа.