代码之家  ›  专栏  ›  技术社区  ›  domin

C#8.0中零原谅运算符的精确语义?

  •  0
  • domin  · 技术社区  · 5 年前

    根据 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空原谅运算符的确切语义是什么( ! )?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Dave Cousineau    5 年前

    正如你所说:

    后缀!运算符没有运行时效果-其计算结果为基础表达式的结果。它唯一的作用是更改表达式的空状态, 并限制对其使用的警告 .

    因此,操作员通常会限制可空性警告。

    ! 似乎也改变了具体泛型参数(从object?到object)的可空性

    指定了 bar 明确地作为 IEnumerable<object> ,并使用 ! 操作员,这抑制了警告。

    推荐文章