表情主体函数怪异行为

Expression bodied Function Weird Behavior

提问人:Srikrishna Sharma 提问时间:3/1/2023 最后编辑:CharliefaceSrikrishna Sharma 更新时间:3/1/2023 访问量:76

问:

当我使用

    var frontPage = await GetFrontPage();

    protected override async Task<WordDocument> GetFrontPage()
    {
        return null;
    }

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

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

我得到了一个.NullReferenceException

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

C# .NET 异步 Await NullReferenceException 表达式正文

评论


答:

5赞 Jon Skeet 3/1/2023 #1

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

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

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

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

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

0赞 Oleksandr Veretennykov 3/1/2023 #2

尝试:

Func<Task<WordDocument>> frontPage = async () => await GetFrontPage();

protected override async Task<WordDocument> GetFrontPage() => await Task.FromResult<WordDocument>(null);

评论

0赞 Firo 3/1/2023
protected override Task<WordDocument> GetFrontPage() => Task.FromResult<WordDocument>(null);更短、开销更小
-1赞 Srikrishna Sharma 3/1/2023 #3

这对我有用:

    protected override async Task<WordDocument> GetFrontPage() => await Task.FromResult<WordDocument>(null);

评论

1赞 Firo 3/1/2023
protected override Task<WordDocument> GetFrontPage() => Task.FromResult<WordDocument>(null);更短、开销更小