C#出现「非空事件退出构造函数必须包含非空值」警告是否与.Net6有关?
是否和.NET 6有关
是,这个警告属于可空引用类型(Nullable Reference Types, NRT) 的编译检查规则,该特性从C# 8.0开始支持,而.NET 6及更高版本的官方项目模板默认开启了可空引用类型检查,所以才会触发这个警告。
遗漏的规则说明
开启可空引用类型检查后,所有引用类型的成员默认被视为「不可为null」,编译器强制要求所有非空引用类型成员必须在构造函数执行完成前完成赋值,否则就会抛出你遇到的这类警告。
你代码中声明的SomeEvent是委托类型的事件,委托属于引用类型,你既没有在构造函数中给它赋值,也没有将它声明为可空类型,因此触发了编译警告。
常用修复方案
- 方案1:将事件标记为可空类型(最符合常规业务场景的写法)
委托类型后加?声明为可空,触发事件前做非空判断即可:// 声明可空事件 public event SomeDelegate? SomeEvent; // 触发事件的写法 SomeEvent?.Invoke(this, EventArgs.Empty); - 方案2:给事件设置默认空实现
初始化阶段给事件赋值一个空的委托实现,保证永远不为空,不需要调整触发逻辑:public event SomeDelegate SomeEvent = delegate {}; - 方案3:使用空原谅运算符强制抑制警告(仅适合你100%确认事件会在构造逻辑中被赋值的场景,不推荐常规使用)
public event SomeDelegate SomeEvent = default!;
内容的提问来源于stack exchange,提问作者ruwenzori
相关产品推荐
相关产品推荐

