首页 > 解决方案 > 布尔表达式中的 C# null 或 null 条件运算符

问题描述

有人可以向我解释为什么这有效吗?

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

foo为 null 时,它变得等价于以下内容:

bool bar = null > 7;

IntelliSense 说两者null7属于 type Nullable<int>,但是编译器是如何决定的呢?!

此外,Nullable<T>没有定义大于运算符。怎么可能?不能保证T定义大于运算符。

标签: c#

解决方案


正如 Rofus 和 Jeroin 在评论中正确指出的那样,T 到 T 之间的转换?当您与“ Null”进行比较时总是隐含的 7 变成了“ Nullable<int>

bool bar = foo?.Count > 7;

类似于 -

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

关于 运营商的第二个问题。>是的,虽然Nullable<T>结构没有定义诸如 , 或 even 之类的运算符<>==以下代码仍然可以正确编译和执行,这与您的情况类似 -

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

这是因为编译器lifts大于来自底层值类型的运算符,例如 -

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

Operator LiftingLifted Operators意味着您可以在 T? 上隐式使用 T 的运算符。编译器对不同Nullable<T>类型的运算符集有不同的规则集来处理它们。


推荐阅读