← 中文资源

简体中文版本

C# ArgumentNullException: 值不能为 null

修复 C# 的 ArgumentNullException:追踪 null 来源、启用可空引用类型并在公共 API 边界做守卫。

阅读英文原文

症状

某方法抛出 ArgumentNullException 并指明一个调用方以为已设置的参数。被报告的参数可能离 null 真正的来源很远。

诊断

借助参数名向前回溯:

public void Send(IMessenger messenger) {
    ArgumentNullException.ThrowIfNull(messenger); // fails here
}

启用可空类型可在编译期捕获此类问题。

修复

在边界做守卫并启用可空性:

#nullable enable
public sealed class Client {
    public Client(HttpClient http) {
        ArgumentNullException.ThrowIfNull(http);
        _http = http;
    }
    private readonly HttpClient _http;
}

在启动时校验配置。

验证

接线完成后重跑,不再出现 ArgumentNullException。补一个传入 null 的测试,断言守卫抛出且参数名正确。