首页 > 解决方案 > 后缀!C# 中的(感叹号)运算符

问题描述

最后一天,我在 GitHub 上探索 .NET 源代码,偶然发现了以下结构:((SomeTypeToCast)variable!).SomeMethodToCall().

请注意后缀最初在这里列出

所以,一个简单的问题:这是什么?

PS:就我个人而言,我对这件事的含义有几个猜测:有点“这个值永远不会为空”。但是,C# 中没有这样的运算符(至少公开可用),并且当我自己在测试项目中尝试它时,这样的表达式无法编译。

标签: c#

解决方案


这是 C# 8 中的null-forgiving运算符(也称为“damn-it”运算符),它有效地告诉编译器假设该值将是非 null 的。它有点像演员表,告诉编译器你比它更了解 - 但它在执行时没有影响,所以你有效地绕过了编译器检查的安全性。

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

我的经验中的典型用途:

  • 测试您的参数验证代码,以证明如果您确实将 null 传递给一个方法,那么您就可以抛出验证ArgumentNullException
  • 由于编译器不知道的其他不变量,您确定该值不会为空的地方。(例如,在 Noda Time 中,我有一个ParseResult<T>包含值字段和异常提供程序的字段。异常提供程序为 null 或值为 null,但绝不是两者,而且我总是在使用该值之前检查异常提供程序。)

推荐阅读