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

Vla*_*she 2 c#

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

请注意后缀原来在这里列出

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

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

Jon*_*eet 7

这是C#8中的允许空值的运算符(也称为“该死的”运算符),有效地告诉编译器假定该值将为非空值。在告诉编译器您比它知道的更多之前,它有点像转换(cast),但是它在执行时没有作用,因此您实际上绕过了编译器检查的安全性。

它是C#8可空引用类型功能的一部分引入。它在一个公开预览可用版本的.NET核心3.0 SDK的。

根据我的经验,典型的用法是:

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