为何C#中int?与int的比较代码可正常编译运行?
为何C#中int?与int的比较代码可正常编译运行?
我太懂你的困惑了!按之前C#的老规则,int?(可空值类型)和int直接比较,确实会因为返回的是bool?而非bool,触发CS0266错误——就像你查到的结论那样。但你在VS2022 + .NET 4.8里能正常编译运行,核心原因是C#语言版本升级后,编译器悄悄给你做了语法糖处理!
先看你的测试代码:
using System; namespace MyTestApp { internal class Program { static void Main(string[] args) { int? v = null; if (v > 0) { Console.WriteLine("Somehow compiled?"); } } } }
你从反汇编里看到的GetValueOrDefault()和get_HasValue()调用,就是编译器在背后帮你做的等价逻辑转换。它把你写的v > 0自动翻译成了:
if (v.HasValue && v.GetValueOrDefault() > 0)
这样一来,最终返回的就是标准的bool值,完全符合if语句的要求,自然能正常编译运行。
补充说明:
- 这个特性是C# 8.0及以后版本引入的,不管你的目标框架是.NET 4.8还是.NET Core/.NET 5+,只要你用的编译器支持对应C#版本(比如VS2022默认支持C# 10+),就能享受到这个语法糖。
- 之前的错误结论,应该是基于旧版C#的规则,没考虑到新编译器的自动空值检查逻辑。
- 你看到的反汇编流程完全对应手动写的空值判断:先取可空类型的实际值做比较,再判断是否有有效值,最后把两个结果做“与运算”,得到最终的布尔判断结果。
备注:内容来源于stack exchange,提问作者Dmitry Streblechenko
相关产品推荐
相关产品推荐

