在C#中,参数名后面跟着的 !! 运算符是什么?

编程语言 2026-07-11

在.NET运行时源代码中,在 这行 上,我们将看到:

public override string Get( string value!! ) {
   if ( value.Length == 0 ) {
       return string.Empty;
   }

   // ...
}

参数 value 之后有两个感叹号。

起初,我以为这可能是我错过的与空可空注解相关的某些C#语言特性,直到我意识到,这甚至不是有效的C#代码,仍然在.NET运行时中被编译。

The !! 对Visual Studio来说没有意义。我正在使用最新的C#语言特性,但这并不能编译:

Error

它肯定是 编译过的

这是怎么回事?为什么官方运行时源代码树中会有一行无效的C#代码,而且在那里也会被编译?

解决方案

参数名后的 !!参数空检查运算符,这是一个曾被提议用于C# 11的特性,但最终 被撤销并且从未在任何公开的C#版本中发布

使用时,string value!! 将自动生成一个等价于空检查的代码:

if (value is null) throw new ArgumentNullException(nameof(value));

之所以它出现在.NET运行时源代码中却在你的项目中不编译,是因为.NET运行时使用一个自定义的Roslyn编译器分支,内部仍然包含这种实验语法。公开的C#编译器(Visual Studio和 dotnet build 使用的那个)从未包含它,因此在运行时自己构建系统之外的任何地方都是一个语法错误。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章