根据
documentation
:
后缀!运算符没有运行时效果-其计算结果为基础表达式的结果。它唯一的作用是更改表达式的null状态,并限制在使用时发出的警告。
例子:
IEnumerable<object?>? foo = GetFromSomewhere();
IEnumerable<object> bar = foo; // warning CS8619: Nullability of reference types in value of type 'IEnumerable<object?>' doesn't match target type 'IEnumerable<object>'.
(请注意,警告没有正确地将值的类型标识为。)
IEnumerable<object?>?
,但声称是的
IEnumerable<object?>
.)
添加时
!
:
IEnumerable<object?>? foo = GetFromSomewhere();
IEnumerable<object> bar = foo!; // No warning.
!
似乎改变了具体泛型参数的可空性(从
object?
到
object
)而且,不仅是表达式所表示的实际对象实例的空状态
foo
.
但前提是我对
bar
明确地使用时
var
相反,这种行为更像是我对文档的解释:
IEnumerable<object?>? foo = GetFromSomewhere();
var bar = foo!;
IEnumerable<object> baz = bar; // warning CS8619: Nullability of reference types in value of type 'IEnumerable<object?>' doesn't match target type 'IEnumerable<object>'.
所以
酒吧
被推断为
IEnumerable<反对>
,只删除最外层的问号。
C#8.0空原谅运算符的确切语义是什么(
!
)?