为何要为C#类的成员属性赋值default!?
关于C#中非可空属性使用
default!的疑问解答 你的理解是否正确?
完全正确:
default关键字对于引用类型来说,返回的默认值就是null;!是null宽恕运算符,作用是告知编译器:我明确知道这里赋值的是null,但我会保证在实际使用这个属性时它不会是null,你无需抛出非可空属性赋值null的警告。
为什么需要写= default!?
这和C# 8.0引入的**可空引用类型(Nullable Reference Types)**特性直接相关——ASP.NET Core 6项目默认是启用这个特性的:
- 如果你只写
public Category Category { get; set; },编译器会触发CS8618警告:“退出构造函数时,不可空属性必须包含非null值”。因为编译器默认认为非可空引用类型的属性必须在构造阶段就被赋值为非null值。 - 添加
= default!后,相当于显式给属性赋了值(虽然是null),同时用!豁免了编译器的null检查,把“确保属性非空”的责任转交给了你自己。
关于引用类型默认值的认知变化
底层逻辑没有改变:引用类型的字段/属性在对象实例化时,默认值依然是null。变化的是编译器的检查规则:
- 启用可空引用类型特性后,声明为
Category(非可空)的属性,编译器会强制要求你明确初始化它,或者用!告知编译器你自己处理null风险; - 如果你希望属性允许为null,应该显式声明为
public Category? Category { get; set; },此时编译器不会强制要求初始化,也不会在赋值null时发出警告。
内容的提问来源于stack exchange,提问作者David Thielen
相关产品推荐
相关产品推荐

