Null-forgiving 运算符导致可空类型

Null-forgiving operator results in nullable type

我有一个带有 属性 <Nullable>enable</Nullable> 的 .NET 6.0 C# 控制台项目。其中,我有以下内容,其中 Span 是原始数据类型:

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

当我调用 FatalError() 时,立即原谅第二个参数中的空值:

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,运算符应该return非可空类型,因此我有点迷茫。

为了重现它,完整的项目在这个 GitHub commit 中。 运行 dotnet build 可以看看最后的错误。地点

来自您在问题中添加的docs

you use the null-forgiving operator to declare that expression x of a reference type isn't null.

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