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

.NET Core 3.1中null条件运算符与default比较的行为差异疑问

.NET Core 3.1中a?.BirthDate == default的行为差异问题

在.NET Core 3.1环境下运行以下代码时,Test 2的输出与预期不符。原本预期所有测试输出均为“default”,但实际Test 2显示为“NOT default”。

代码示例

using System;
                    
public class Program
{
    public static void Main()
    {
        var a = new Customer();
        
        if (a.BirthDate == default)
            Console.WriteLine("Test 1 Result: default");
        else
            Console.WriteLine("Test 1 Result: NOT default");
            
        
        if (a?.BirthDate == default)
            Console.WriteLine("Test 2 Result: default");
        else
            Console.WriteLine("Test 2 Result: NOT default");
        
        
        if (a.BirthDate == default(DateTime))
            Console.WriteLine("Test 3 Result: default");
        else
            Console.WriteLine("Test 3 Result: NOT default");
        
        
        if (a?.BirthDate == default(DateTime))
            Console.WriteLine("Test 4 Result: default");
        else
            Console.WriteLine("Test 4 Result: NOT default");
    }
}

public class Customer
{
    public DateTime BirthDate {get;set;}
}

实际输出

Test 1 Result: default
Test 2 Result: NOT default
Test 3 Result: default
Test 4 Result: default

原因解析

核心差异在于**a?.BirthDate的类型是Nullable<DateTime>(即DateTime?)**,以及default关键字的类型推断逻辑:

  • Test 1中,a.BirthDate是值类型DateTime,编译器自动将default推断为default(DateTime)(即DateTime.MinValue),两者相等,输出“default”。
  • Test 2中,a?.BirthDate返回可空值类型DateTime?,此时未指定类型的default会被推断为default(object)也就是null。而a不为null,a.BirthDate的默认值是DateTime.MinValue,包装成DateTime?后是有值的实例(不是null),因此和null比较结果为false,输出“NOT default”。
  • Test 3和Test 4中,明确指定了default(DateTime),编译器会将DateTime?类型的a?.BirthDate自动拆箱(或隐式转换)后与DateTime.MinValue对比,结果相等,输出“default”。

内容的提问来源于stack exchange,提问作者furkan.kaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 08:47:13