如何为生成代码自动初始化的引用类型属性添加非空注解?
可行的解决方案有以下三种,均不需要将属性声明为可空引用类型:
1. 使用null!初始化兜底(兼容所有支持可空引用类型的C#版本)
直接在属性声明末尾赋值为null!,明确告知编译器你人为保证该属性不会为null,跳过初始化检查:
public class MyEntity : Entity { [Field] [Association] public EntitySet<OtherEntity> Relation { get; set; } = null!; [Field] [Association] public ParentEntity Parent { get; set; } = null!; [Field] [Association] public OtherEntity? Relationship { get; set; } }
这种方案写法最简洁,属性保留非可空声明,使用时不会触发任何空引用警告,完全符合ORM场景的语义。
2. 使用C# 11+的required关键字
如果你的项目使用C# 11及以上版本,可以用required修饰属性,告知编译器该属性必须在对象实例化时完成赋值:
public class MyEntity : Entity { [Field] [Association] public required EntitySet<OtherEntity> Relation { get; set; } [Field] [Association] public required ParentEntity Parent { get; set; } [Field] [Association] public OtherEntity? Relationship { get; set; } }
该方案语义更严谨:如果你手动调用new MyEntity()创建实例,编译器会强制要求你给所有required属性赋值,避免手动创建时遗漏初始化逻辑,而ORM的自动初始化逻辑天然符合该要求,不会产生额外警告。
3. 局部屏蔽CS8618警告
如果你的属性没有setter(只读属性,由ORM反射赋值),可以局部屏蔽非可空属性未初始化的警告:
public class MyEntity : Entity { #pragma warning disable CS8618 // 非可空属性由ORM自动初始化,无需手动赋值 [Field] [Association] public EntitySet<OtherEntity> Relation { get; } #pragma warning restore CS8618 }
这种方案不会修改属性的可空性,也不会影响其他代码的警告检查。
你提到的同时用?和[NotNull]的写法属于早期可空引用特性的过渡用法,现在已经被上面三种更符合直觉的方案替代,不需要提交特性申请。
内容的提问来源于stack exchange,提问作者Ondrej Tucny
相关产品推荐
相关产品推荐

