代码之家  ›  专栏  ›  技术社区  ›  Matheus Dias de Souza

Null原谅运算符导致可为Null的类型

  •  0
  • Matheus Dias de Souza  · 技术社区  · 2 年前

    我有个好主意。NET 6.0 C#控制台项目 <Nullable>enable</Nullable> .在这本书中,我有以下内容,在哪里 Span 是一种基本数据类型:

    sealed class PrivateParser {
       private void FatalError(int msgId, Span span /*, ...*/) {
           /* ... */
       }
    }
    

    当我打电话的时候 FatalError() ,在第二次声明中立即原谅null:

    FatalError(0x80A0400, id.Span!);
    

    编译器输出:

    error CS1503: Argument 2: cannot convert from
    'ShockBasic.Semantics.SourceData.Span?' to
    'ShockBasic.Semantics.SourceData.Span' [C:\Users\hando\Documents\shockbasic\sb\ShockBasic.Compiler.csproj]
    

    看见 Microsoft docs ,运算符应该返回不可为空的类型,因此我有点不知所措。

    为了复制它,完整的项目就在这里 GitHub commit dotnet build 你可以看看最后一个错误。位置

    1 回复  |  直到 2 年前
        1
  •  1
  •   gunr2171 Alvaro    2 年前

    docs 您在问题中添加的内容:

    使用null原谅运算符来声明 参考 类型不是空的。

    Span 是一种值类型。更改“可空值类型”(在您的情况下)( Nullable<Span> / Span? )调用应该使用的方法时 FatalError(0x80A0400, id.Span.Value); ,但这可能会 InvalidOperationException ( docs )当 id.Span 将为空