You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:38:07