C# условный оператор null или null в логическом выражении - PullRequest
1 голос
/ 05 августа 2020

Может кто-нибудь объяснить мне, почему это работает?

List<int> foo = null;
bool bar = foo?.Count > 7;

Когда foo имеет значение null, это становится эквивалентным следующему:

bool bar = null > 7;

IntelliSense говорит, что оба null и 7 относятся к типу Nullable<int>, но как компилятор решил это?!

Кроме того, Nullable<T> не определяет оператор «больше». Как это могло быть? Нет гарантии, что T определяет оператор «больше».

1 Ответ

0 голосов
/ 06 августа 2020

Как Рофус и Джероин правильно указали в комментариях, что преобразование Т в Т? всегда неявно, при сравнении с «Null» 7 становится «Nullable<int>»

bool bar = foo?.Count > 7;

аналогично -

 int? count = null; 
 int? k = 7; // Implicit conversion here!
 var bar =  count > k;

По Вашему второму вопросу по оператору >. Да Nullable<T> struct не определяет такие операторы, как <'> Or even ==. Но все же следующий код компилируется и выполняется правильно, что похоже на ваш случай -

int? x = 3;
int? y = 10;
bool b = x > y;

Это потому, что компилятор lifts больше, чем оператор из базового типа значения, например -

bool b = (x.HasValue && y.HasValue) ? (x.Value > y.Value) : false;

Operator Lifting или Lifted Operators означает, что вы можете неявно использовать операторы T на T ?. Компилятор имеет разный набор правил для разного набора операторов при их обработке для типов Nullable<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...