You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中default与default!的区别是什么?

解析C#中default!的作用

先直接给出结论:default!不会改变实际运行时的值,string类型的default!仍然是null,它的作用完全针对编译器的静态分析,和运行时行为无关。

为什么要加!(null原谅运算符)

在启用**可空引用类型(NRT)**的项目中,编译器会对引用类型的空值情况做严格检查。对于这段record代码:

public record Person
{
    public string FirstName { get; init; } = default!;
    public string LastName { get; init; } = default!;
};

如果只写= default,编译器会抛出警告:因为string是非可空引用类型(不是string?),但default(string)的结果是null,编译器会判定这个属性可能违反非可空约定。

加上!之后,相当于开发者给编译器传递一个明确信号:我保证这个属性在实际使用时不会是null,无需触发空引用警告。这段代码的设计意图是,创建Person实例时一定会通过位置初始化器(比如new Person { FirstName = "张三", LastName = "李四" })或record的主构造函数给属性赋值,默认的null只是一个占位,不会被实际用到。

常见误区澄清

  • 它不会把null转换成空字符串,运行时属性的初始值还是null,如果开发者忘记初始化就直接使用,仍然会抛出NullReferenceException。
  • !仅用于抑制编译器的静态分析警告,不改变任何运行时逻辑,本质是开发者对编译器做出的“值非空”承诺。

内容的提问来源于stack exchange,提问作者Xeno Xetric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:09:28