在 C# 8.0 中调用方法之前,感叹号是什么意思?



我发现了一个用C#编写的代码,似乎是8.0版。在代码中,调用方法之前有一个感叹号。代码的这一部分是什么意思,最重要的是,它的用途是什么?

var foo = Entity!.DoSomething();

这将是 null 宽容运算符。
它告诉编译器"这不是空,相信我",因此它不会为可能的空引用发出警告。

在这种特殊情况下,它告诉编译器Entity不为 null。

!是 Null-Forgive 运算符。具体来说,它有两个主要影响:

  • 它将表达式的类型(在本例中为Entity修改(从可为空的类型更改为不可为空的类型;(例如,object?变为object(

  • 它禁止显示与可空性相关的警告,这些警告可以隐藏其他转换

这似乎特别针对类型参数:

IEnumerable<object?>? maybeListOfMaybeItems = new object[] { 1, 2, 3 };
// inferred as IEnumerable<object?>
var listOfMaybeItems = maybeListOfMaybeItems!;
// no warning given, because ! supresses nullability warnings
IEnumerable<object> listOfItems = maybeListOfMaybeItems!;
// warning about the generic type change, since this line does not have !
IEnumerable<object> listOfItems2 = listOfMaybeItems;

这称为 null 宽容运算符,在 C# 8.0 及更高版本中可用。它在运行时不起作用,仅在编译时起作用。其目的是通知编译器某些可为 null 类型的表达式不为null,以避免可能出现有关 null 引用的警告。

在这种情况下,它告诉编译器Entity不为 null。

相关内容

  • 没有找到相关文章

最新更新