非可空引用类型全属性初始化的CS8618警告优雅解决方法咨询
解决C#可空引用类型中CS8618警告的优雅方案
在启用可空引用类型的代码中,当手动实现属性而非使用自动属性时,比如这段代码:
public class C1 { private string _value; public string Value { get => _value; set => _value = value; } public C1() { Value = "Test"; } }
会触发CS8618警告:“非可空字段‘_value’在退出构造函数时必须包含非空值”。虽然转为自动属性可以解决问题,但如果想保留手动属性的写法,这里有两种比#pragma disable更优雅的解决方式:
方案一:给属性setter添加[MemberNotNull]特性
编译器无法自动识别构造函数中通过属性setter给私有字段赋值的行为,因此可以直接在Value属性的setter上标记[MemberNotNull(nameof(_value))],明确告知编译器:调用这个setter会确保_value不为空。修改后的代码如下:
public class C1 { private string _value; public string Value { get => _value; [MemberNotNull(nameof(_value))] set => _value = value; } public C1() { Value = "Test"; } }
这样编译器就能追踪到构造函数中调用Value的setter会给_value赋值非空值,从而消除警告。
方案二:构造函数中直接初始化私有字段
如果业务场景允许,也可以直接在构造函数中给_value赋值,同时保留手动属性的写法:
public class C1 { private string _value; public string Value { get => _value; set => _value = value; } public C1() { _value = "Test"; } }
这种方式简单直接,但如果后续需要给setter添加额外逻辑(比如校验、通知),方案一的灵活性更高。
内容的提问来源于stack exchange,提问作者Holger
相关产品推荐
相关产品推荐

