C#中的后缀!(感叹号)运算符

40
GitHub上探索.NET源代码时,我偶然发现了这个。
((SomeTypeToCast)variable!).SomeMethodToCall()

这个后缀 ! 是什么意思?
我猜想这是一种表示“这个值永远不会为空”的方式。然而,在C#中并没有这样的运算符(至少公开可用),当我在测试项目中尝试这样的表达式时,它无法通过编译。
1个回答

66

这是 C# 8 中的 null-forgiving 运算符(也称为“该死的”运算符),有效地告诉编译器假定该值不为空。它有点像强制转换,因为它告诉编译器你比它更了解情况 - 但在执行时没有任何影响,因此你实际上是绕过了编译器检查的安全措施。

它作为C# 8 可空引用类型特性的一部分引入。 它可在 .NET Core 3.0 SDK 的公共预览版本中使用。

我经常使用的典型例子:

  • 测试参数验证代码,以证明传递 null 到方法时,你已经进行了验证,并会抛出 ArgumentNullException
  • 在编译器不知道的其他不变量存在的情况下,你确信该值不会为空。 (例如,在 Noda Time 中,我有一个 ParseResult<T>,它有一个值和一个异常提供程序字段。异常提供程序要么为空,要么值为空,但从不同时为空;并且在使用该值之前,我始终会检查异常提供程序。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接