在C#项目中需显式启用可空引用类型,推荐在.csproj的中添加enable;启用后string为非空,string?为可空,二者与Nullable机制不同,仅影响编译期分析。
如何在 C# 项目中启用可空引用类型
可空引用类型不是默认开启的,必须显式启用,否则 ? 语法会被编译器忽略(仅作注释用途)。启用后,编译器会对变量、参数、返回值等进行空状态分析,并在潜在空引用访问处发出警告(如 CS8602、CS8600)。
启用方式有两种,推荐在项目文件中全局开启:
- 在
.csproj文件的中添加:enable
- 或使用
#nullable enable预处理器指令在单个文件顶部启用(不推荐长期使用,难以统一管控) - 注意:启用后,所有引用类型变量默认为“不可为空”,例如
string name表示name不应为null;要允许为空,必须显式声明为string? name
为什么 string? 不等于 Nullable
string? 是可空引用类型的语法糖,和 Nullable(即 T? 用于值类型)**完全不同机制**。后者是运行时类型(如 int? 编译为 Nullable),而前者只是编译期注解,不改变 IL 或运行时行为。
常见误解:
-
typeof(string?)就是typeof(string),不是新类型 -
default(string?)仍是null,不会变成某种“可空包装对象” -
string?的作用纯粹是触发编译器空状态分析——它告诉编译器:“这个变量可以合法地持有null,别对它报CS8602”
处理常见警告:CS8602(解引用可能为 null 的表达式)
这是启用可空引用类型后最常遇到的警告,通常出现在调用方法、访问属性或索引前未确认非空。编译器无法静态证明安全时就会报此警告。