C# 中引用类型后缀的问号代表什么含义?
引用类型后加问号的作用
这个语法是C# 8.0版本引入的**可空引用类型(Nullable Reference Types, NRT)**特性,仅在开启可空引用类型检查的上下文下生效(.NET 6及以上版本的项目默认开启该特性),和值类型加问号的含义完全不同,核心作用如下:
- 显式标记引用类型的可空性
开启可空引用类型检查后,默认的普通引用类型是不可为空的,加问号?才是主动声明该引用类型允许存储null值。比如string声明的参数不允许传入null,string?声明的参数则明确支持传入null。 - 触发编译器的空安全静态检查
- 如果你尝试向未加问号的引用类型参数传入
null,编译器会抛出警告/错误,提前规避无意义的空值传入 - 如果你访问加了问号的可空引用类型的成员,编译器会强制提醒你先做非空判断,从编码阶段降低空引用异常的发生概率
- 如果你尝试向未加问号的引用类型参数传入
- 明确API契约
无需额外注释,调用方通过参数类型就能明确知道这个位置是否允许传空,降低协作、调用三方库时的理解成本。
你提到的OverflowException构造函数的参数写法就是.NET框架适配可空引用类型后的标准实现,明确告知开发者message和innerException两个参数都允许传入null。
注:该语法仅作用于编译期静态检查,运行时层面引用类型本身仍然支持存储
null,和C# 8之前的运行时逻辑没有区别。
内容的提问来源于stack exchange,提问作者Kuba K
相关产品推荐
相关产品推荐

