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