.net 表达式体函数怪异行为

nhhxz33t  于 2023-03-09  发布在  .NET
关注(0)|答案(3)|浏览(129)

当我使用

var frontPage = await GetFrontPage();

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

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

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

我得到了一个NullReferenceException
有人能帮我理解这两种说法之间的区别吗?

e4yzc0pl

e4yzc0pl1#

有人能帮我理解这两种说法之间的区别吗?
你的第一个声明是async,所以编译器生成适当的代码使它返回一个Task<WordDocument>,它有一个带有方法结果的结果,任务本身不是空的-它的 result 是空的。
你的第二个声明是 notasync,因此它只返回一个空引用,任何等待或取消引用该空引用的代码都将导致抛出NullReferenceException
只需在第二个声明中添加async修饰符,它的工作方式与第一个声明相同。
注意这里没有lambda表达式--你的第二个声明是一个 *expression-bodied方法 *,它只是使用了与lambda表达式相同的语法(=>)。

tv6aics1

tv6aics12#

尝试:

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

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

xytpbqjk3#

这对我很有效:

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

相关问题