使用三元运算符时,可空目标类型的default值是否应为null?
C#三元运算符中default的类型推断问题
先看这段代码示例:
Guid g = Guid.NewGuid(); Guid? g2 = Guid.NewGuid(); Guid? defaultGuid = false ? g : default; //#1 结果为00000000-0000-0000-0000-000000000000 Guid? defaultNullableGuid = false ? g2 : default; //结果为null
你可能会疑惑:既然变量defaultGuid的类型是Guid?,为什么三元运算符里的default返回的是Guid的默认值(全0 Guid),而不是Guid?的默认值null?
核心原因是三元条件运算符的类型推断逻辑:它不会直接以变量的目标类型为准,而是先根据两个分支的表达式(g和default)推断出共同类型,再把这个类型的结果转换为目标类型。
在第一个例子里,g是Guid(非可空值类型),未指定类型的default会匹配另一个分支的类型,也就是Guid,所以default在这里等价于default(Guid),结果是全0 Guid,之后再被隐式转换为Guid?,最终变量值是带全0 Guid的可空类型,而非null。
而第二个例子里,g2是Guid?,default会匹配这个类型,等价于default(Guid?),结果就是null。
这也是重构时容易踩的坑:如果之前目标类型是Guid,用var guid = Guid.NewGuid()作为三元分支,default会被推断为Guid的默认值;当你把目标类型改成Guid?时,只要分支里的表达式还是非可空的Guid,default依然会被推断为Guid的全0值,而不是Guid?的null,这就会导致单元测试不符合预期。
内容的提问来源于stack exchange,提问作者UNeverNo
相关产品推荐
相关产品推荐

