C#开启可空引用类型时如何避免params参数为null
问题解答
为什么开启#nullable enable后params参数仍然允许传入null
首先澄清:params int[] foo在可空上下文下的语义确实是不可空数组,你感知到的「默认可空」是误解,本质是可空引用类型的规则默认是警告级别,而非编译错误:
- 可空引用类型是C# 8.0引入的编译期检查特性,为了保证和旧代码的兼容性,所有违反可空约定的行为(包括给普通不可空引用参数传null)默认都只会触发警告,不会直接阻断编译。
- params参数本身没有特殊的可空规则,你写
params int[] foo就是不可空,写params int[]? foo才是可空,和普通数组参数的规则完全一致。
你看到MyMethod(null)可以正常编译,只是因为这个违反可空约定的行为默认是警告,不是错误。
如何强制params参数不可空,禁止传入null
如果你需要让传入null的行为直接触发编译失败,只需要将对应可空警告升级为编译错误即可:
- 打开你的项目
.csproj配置文件,在PropertyGroup节点中添加如下配置:
<PropertyGroup> <!-- 已经开启可空的话这行本来就有 --> <Nullable>enable</Nullable> <!-- 将可空相关的空值传入警告设为编译错误 --> <WarningsAsErrors>CS8625</WarningsAsErrors> </PropertyGroup>
如果需要所有可空相关的警告都转成错误,可以配置为:
<WarningsAsErrors>Nullable</WarningsAsErrors>
配置完成后,MyMethod(null)的写法就会直接报编译错误,完全满足你编译期禁止传入null的需求,不需要修改原有方法签名。
如果你不想全局修改警告规则,也可以在方法内部添加运行时空值校验,配合相关特性可以让编译器进一步优化空值检查的提示:
#nullable enable public void MyMethod(params int[] foo) { if (foo is null) throw new ArgumentNullException(nameof(foo)); // 后续逻辑 }
这种方式虽然不能在编译期直接阻断null传入,但可以在运行时第一时间抛出异常,避免空引用扩散。
内容的提问来源于stack exchange,提问作者Robert S.
相关产品推荐
相关产品推荐

