C# .NET匿名类型中null的转换机制及编译差异问询
匿名类型赋值null的编译差异解析
第一段代码编译失败的原因
写var x = new { Property = null };时,C#编译器需要给匿名类型的Property确定具体类型,但null本身没有专属类型——它只是所有引用类型、可空值类型都能接受的有效值,没法单独用来推导类型。编译器找不到任何可参考的类型线索,所以直接抛出Cannot assign null to anonymous type property错误。
第二段代码正常运行的原理
第二段里的三元表达式someBool ? "value" : null,编译器会分析两个分支的类型:
- 第一个分支
"value"是明确的string类型; - 第二个分支
null能隐式转换成string(因为string是引用类型,本身就允许赋值为null;如果开启了可空引用类型,会推断成string?)。
编译器会把整个三元表达式的类型推断为string(或string?),匿名类型的Property也就跟着被指定为这个类型,所以能正常编译运行。你的推测是对的,这里确实存在null到string(或string?)的隐式转换,而三元表达式刚好给编译器提供了足够的类型信息,让它能完成类型推导。
内容的提问来源于stack exchange,提问作者Cseed rvr
相关产品推荐
相关产品推荐

