允许空值的操作符导致可空类型



我有一个。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:UsershandoDocumentsshockbasicsbShockBasic.Compiler.csproj]

请参阅Microsoft文档,操作符应该返回非空类型,因此我有点迷路了。

要复制它,完整的项目在这个GitHub提交。运行dotnet build,您可以看到最后一个错误。位置

跨度
  • PrivateParser

从您在问题中添加的文档中:

使用允许空值的操作符声明引用的表达式x类型不为空

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