我发现了一个用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。