用途:讲解 C# 可空引用类型(NRT)的注解策略、旧代码库迁移方法,以及 AI 代理生成代码时最常见的 NRT 注解错误。NRT 在现代 .NET 模板(net6.0+)中默认启用,但许多既有代码库仍需迁移。
主要能力:覆盖 NRT 注解策略与可空上下文配置、旧代码库迁移指导、可空特性(MaybeNull、NotNull 等),以及常见 AI 代理注解错误。不涉及空值处理风格(模式匹配、null 条件运算符)和模式匹配语言特性,这两部分分别参见 dotnet-csharp-coding-standards 与 dotnet-csharp-modern-patterns。
启用方式:项目级推荐在 .csproj 或 Directory.Build.props 中设置 <Nullable>enable</Nullable>;迁移时可按文件在顶部写 #nullable enable。注意 TFM 本身不强制 NRT,真正生效的是该 MSBuild 属性,升级到 net8.0 的旧项目可能并未启用。
迁移策略:大型代码库可增量启用——先在项目设置 <Nullable>enable</Nullable>,再在每个既有文件顶部加 #nullable disable,然后逐文件移除并修复警告,通过统计剩余指令数跟踪进度。
可空特性:使用 System.Diagnostics.CodeAnalysis 中的特性表达编译器无法推断的契约,如 [NotNullWhen(true)]、[MemberNotNull]、[NotNullIfNotNull]、[NotNull]、[DoesNotReturn]、[AllowNull]、[DisallowNull]、[MaybeNull] 等。
常见错误:用 ! 抑制警告、忽略可空警告、接口实现改变可空契约、Try 模式方法缺少 [NotNullWhen]、混淆可空值类型与可空引用类型。EF Core 会依据 NRT 注解区分必填与可选列,导航属性上的 = null! 是少数可接受的用法。
限制:资料未提供具体收费、平台或效果信息。