Я играл с С# 6 Null Conditional Operator (подробнее здесь).
Мне очень нравится синтаксис, и я думаю, что он делает код более читаемым, но я думаю, что сомнительно, что именно код будет делать, когда вы столкнетесь с проверкой значения свойства на объекте, который сам может be null.
Например, если у меня был класс с десятичным свойством на нем, и мне нужна условная проверка значения этого десятичного числа, я бы написал что-то вроде:
if (foo?.Bar > max)
{
// do something
}
На поверхности это выглядит великолепно... Если foo не является нулевым, получите значение Bar и проверьте, превышает ли оно максимальное значение, если оно есть, что-то делать.
Однако, если foo имеет значение null?!
В этой документации о новых и улучшенных функциях С# 6 говорится следующее:
если на самом деле значение объекта равно null, нулевое условие оператор вернет null. Он замыкает вызов в Bar, и немедленно возвращает null, избегая ошибки программирования, которая в противном случае возникает исключение NullReferenceException.
Я написал сценарий здесь, который показывает, что он действительно работает и делает то, что я ожидаю от него, но могу "Я не понимаю, как он решает результат этого состояния.
Как короткое замыкание равно false? В моей голове этот код теперь скажет: "Если foo имеет значение null, проверьте, является ли null значением max, что невозможно, поэтому верните false" или "Если foo имеет значение null, то foo!= Null вернет false, так что вы получите false", однако в документации указано, что нулевая условная проверка возвращает значение null, а не false.