.NET 6开启Nullable后Int32等类型未触发非空构造警告
原因说明
这个现象是由可空引用类型(NRT)的校验范围和值类型的默认特性共同导致的:
- 首先
.csproj中配置的<Nullable>enable</Nullable>仅会对引用类型生效,不会校验值类型的空状态。 - 你提到的
Int32、DateTime、Guid都属于值类型,值类型本身不允许为null,在类实例化时会自动被赋予对应类型的默认值:Int32默认值为0DateTime默认值为0001-01-01 00:00:00Guid默认值为全零的Guid值
因此这些属性在退出构造函数时必然存在非空值,不会触发警告。
- 剩余触发警告的属性中,
Byte[]、String属于引用类型,如果你的FileType是自定义的类(引用类型),这几个属性在没有显式初始化、也没有声明为可空的情况下,实例化后默认值为null,不符合非空引用类型的校验规则,因此会触发对应警告。
常见解决方案
如果这些触发警告的属性确实允许为null,直接在类型后加?声明为可空引用类型即可:
public Byte[]? Content { get; set; } public String? Name { get; set; } public FileType? FileType { get; set; }
如果属性是业务必填不允许为null,你可以通过以下方式消除警告:
- 给属性添加
required修饰符,强制要求实例化时必须赋值 - 在类的构造函数中给这些属性显式赋予非空初始值
内容的提问来源于stack exchange,提问作者Miguel Moura
相关产品推荐
相关产品推荐

