c# - 布尔表达式中的 C# null 或 null 条件运算符
问题描述
有人可以向我解释为什么这有效吗?
List<int> foo = null;
bool bar = foo?.Count > 7;
当foo
为 null 时,它变得等价于以下内容:
bool bar = null > 7;
IntelliSense 说两者null
都7
属于 type Nullable<int>
,但是编译器是如何决定的呢?!
此外,Nullable<T>
没有定义大于运算符。怎么可能?不能保证T
定义大于运算符。
解决方案
正如 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 Lifting
或Lifted Operators
意味着您可以在 T? 上隐式使用 T 的运算符。编译器对不同Nullable<T>
类型的运算符集有不同的规则集来处理它们。
推荐阅读
- c# - Entity Framework Core 需要定义一个主键
- docker - Traefik 与 Let's Encrypt
- mysql - Phpmyadmin 导入 sql 文件错误“...在 '1' 附近使用正确的语法”
- java - 使用二分搜索实现底平方根
- swift - 基于 ipad 或 iphone 改变对象的约束
- python - 我有 2 个函数做同样的事情,但是在调用这两个函数时,只有一个返回,而另一个不返回
- java - 是否可以让我的 JFrame 按钮不断打印输出
- javascript - Promise 函数不返回结果
- java - json格式正确的字符串,但我在转换时仍然出错
- stata - 汉字是.dta文件中的问号