如何让C#编译器识别自定义ThrowIfNull方法的非空保证?
解决自定义ThrowIfNull的编译器非空警告问题
你的问题核心是没给方法参数添加非空断言特性,编译器无法识别调用ThrowIfNull后参数已处于非空状态。
修正步骤
- 引入
System.Diagnostics.CodeAnalysis命名空间,该命名空间包含用于nullable分析的特性。 - 给
ThrowIfNull方法的thing参数添加[NotNull]特性,明确告知编译器:方法正常返回时,此参数必定非空。
修改后的实现代码
using System.Diagnostics.CodeAnalysis; public class MyException : Exception // 注:原类名拼写有误,修正为MyException { public static void ThrowIfNull([NotNull] object? thing) { if (thing is null) Throw(); } [DoesNotReturn] public static void Throw() => throw new MyException(); }
使用示例(警告消失)
object? obj = null; MyException.ThrowIfNull(obj); var str = obj.ToString(); // 不再提示"Dereference of a possibly null reference."
原理说明
[NotNull]特性是C# nullable分析的关键标记之一:当方法执行完成且未抛出异常时,编译器会认定被标记的参数已从可空状态变为非空状态,因此后续代码中对该参数的引用不会再触发空引用警告。
内容的提问来源于stack exchange,提问作者devklick
相关产品推荐
相关产品推荐

