Как Рофус и Джероин правильно указали в комментариях, что преобразование Т в Т? всегда неявно, при сравнении с «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>
.