Я с интересом следил за функцией безопасного навигатора, добавленной в С# 6. Я с нетерпением жду этого какое-то время. Но я нахожу другое поведение, чем я ожидал. Я понимаю, что я действительно не понимаю, как это работает.
Учитывая этот класс
class Foo {
public int? Measure;
}
Вот некоторый код с использованием нового оператора.
Foo f = new Foo { Measure = 3 };
Console.WriteLine(f?.Measure); // 3
f = new Foo { Measure = null };
Console.WriteLine(f?.Measure); // null
f = null;
Console.WriteLine(f?.Measure); // null
До сих пор все работает как ожидалось. ?.
обращается к членам, когда левая сторона не равна нулю, в противном случае возвращается значение null. Но здесь все идет в направлении, которого я не ожидал.
var i = f?.Measure; // i is Nullable<int>
Console.WriteLine(i.HasValue); // false
Console.WriteLine(f?.Measure.HasValue); // null
Что?
Почему я могу получить HasValue
из i
, но не из того же выражения, которое я присвоил i
? Как HasValue
когда-либо быть нулевым?
Изменить: мой реальный вопрос касается поведения программы, а не ошибки компиляции. Я удалил лишний материал о компиляции и более подробно остановился на этом вопросе, почему два разных результата возвращаются по той же логике.