Lambda 函数奇怪的行为

问题描述 投票:0回答:3

我在使用的时候

    var frontPage = await GetFrontPage();

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

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

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

我得到一个空指针异常

任何人都可以帮助我理解这两种说法之间的区别吗?

如果您发现问题有效,请投票。 谢谢!

c# .net lambda nullpointerexception
3个回答
3
投票

任何人都可以帮助我理解这两种说法之间的区别吗?

您的第一个声明是

async
,因此编译器生成适当的代码以使其返回一个
Task<WordDocument>
,其结果与该方法的结果相同。任务本身不为空 - 它的 result 为空。

你的第二个声明是 not

async
,因此它只返回一个空引用。任何等待或取消引用该空引用的代码确实会导致抛出
NullReferenceException

只需将

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

注意这里没有 lambda 表达式——你的第二个声明是一个 expression-bodied 方法。它只是使用与 lambda 表达式相同的语法 (

=>
)。


1
投票

尝试:

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

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

0
投票

这对我有用:

    protected override async Task<WordDocument> GetFrontPage() => await Task.FromResult<WordDocument>(null);
© www.soinside.com 2019 - 2024. All rights reserved.