C# 10中能否让var默认定义为非可空引用类型?
问题解答
正常情况下,写var x = new ClassName();时,C#的类型推断应该直接给出非可空的ClassName类型,而非ClassName?。如果你的环境里出现了这种异常推断,核心原因是项目的**nullable引用类型(NRT)**配置问题。
为什么会被推断成可空类型?
这和项目的nullable上下文设置直接相关:
- 当项目启用了nullable上下文(比如
.csproj里设了<Nullable>enable</Nullable>),但代码所在范围的规则是警告级而非强制级,或者VS的代码分析出现了误判(这种情况极少),才会出现把明确初始化的实例推断为可空的情况。 - 你提到的“新创建的数组被标为可空”的问题,本质也是同一个逻辑:启用NRT时,
new int[5]这种明确的非空初始化本应被推断为非可空数组,但如果配置不严谨,就会出现错误的可空推断。
怎么让var默认推断非可空类型?
可以从这几个方面解决:
1. 全局启用严格的nullable强制规则
修改项目的.csproj文件,添加或调整以下配置:
<Nullable>enable</Nullable> <WarningsAsErrors>nullable</WarningsAsErrors>
这样整个项目会强制遵循NRT规则,var x = new ClassName();这种明确初始化非空实例的代码,会被正确推断为非可空的ClassName类型。
2. 局部代码块指定非可空上下文
如果不想全局改配置,可以在单个文件顶部加:
#nullable enable
或者针对某段代码单独设置:
#nullable enable { var x = new ClassName(); // 这里x会被推断为非可空的ClassName } #nullable restore
3. 临时方案:显式声明类型
如果以上配置都没效果,也可以直接放弃var,手动声明非可空类型:
ClassName x = new ClassName();
额外提醒
C#的类型推断逻辑本身是优先推断非可空类型的,只要nullable上下文配置正确,var初始化时赋值了非空实例,就会自动推断为非可空引用类型。如果还是出现可空推断,建议检查VS的代码分析设置,或者清理项目缓存重新编译试试。
内容的提问来源于stack exchange,提问作者Overlord Zurg
相关产品推荐
相关产品推荐

