表达式主体函数的奇怪行为

Sri*_*rma -1 .net c# nullreferenceexception async-await expression-body

当我使用时

    var frontPage = await GetFrontPage();

    protected override async Task<WordDocument> GetFrontPage()
    {
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常,我在 frontpage 变量中得到空值。但是当我将函数重写为

protected override Task<WordDocument> GetFrontPage() => null;

Run Code Online (Sandbox Code Playgroud)

我收到了一个NullReferenceException.

谁能帮助我理解这两种说法之间的区别?

Jon*_*eet 5

谁能帮助我理解这两种说法之间的区别?

您的第一个声明是async,因此编译器会生成适当的代码以使其返回Task<WordDocument>具有该方法结果的结果。任务本身不为 null - 它的结果为 null。

您的第二个声明不是 async因此它只返回一个空引用。任何等待或以其他方式取消引用该空引用的代码确实会导致NullReferenceException抛出 a 。

只需将async修饰符添加到第二个声明中,它的工作方式与第一个声明相同。

请注意,这里没有 lambda 表达式 - 您的第二个声明是一个表达式主体方法=>它只是使用与 lambda 表达式相同的语法 ( )。