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

What does exclamation mark mean before invoking a method in C# 8.0?

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

var foo = Entity!.DoSomething();

这将是 null forgiving operator
它告诉编译器 "this isn't null, trust me",因此它不会针对可能的空引用发出警告。

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

这称为 null-forgiving operator and is available in C# 8.0 and later. It has no effect at run time, only at compile time. It's purpose is to inform the compiler that some expression of a nullable 类型 isn't null 以避免可能出现有关空引用的警告。

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

! 是 Null-Forgiving 运算符。具体来说主要有两个作用:

  • 它将表达式的类型(在本例中它修改 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;