我发现了一段看起来是用C#编写的8.0版本代码。在这段代码中,方法调用前有一个感叹号。请问这段代码的含义是什么,最重要的是它有什么用途?
var foo = Entity!.DoSomething();
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!
来表示对已序列化数据的完全信任,例如当进行反序列化时。如果你问我,这是非常具有讽刺意味的用法,一般情况下最好使用 [JsonConstructor] 属性,但我认为它展示了这个操作符的本质以及何时可能需要使用它。 - EriF89