.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
相关产品推荐
相关产品推荐

