You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让C#编译器识别自定义ThrowIfNull方法的非空保证?

解决自定义ThrowIfNull的编译器非空警告问题

你的问题核心是没给方法参数添加非空断言特性,编译器无法识别调用ThrowIfNull后参数已处于非空状态。

修正步骤

  1. 引入System.Diagnostics.CodeAnalysis命名空间,该命名空间包含用于nullable分析的特性。
  2. 给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:00:55