我在使用的时候
var frontPage = await GetFrontPage();
protected override async Task<WordDocument> GetFrontPage()
{
return null;
}
这段代码工作正常,我在 frontpage 变量中得到空值。但是当我将函数重写为
protected override Task<WordDocument> GetFrontPage() => null;
我得到一个空指针异常
任何人都可以帮助我理解这两种说法之间的区别吗?
如果您发现问题有效,请投票。 谢谢!
任何人都可以帮助我理解这两种说法之间的区别吗?
您的第一个声明是
async
,因此编译器生成适当的代码以使其返回一个Task<WordDocument>
,其结果与该方法的结果相同。任务本身不为空 - 它的 result 为空。
你的第二个声明是 not
async
,因此它只返回一个空引用。任何等待或取消引用该空引用的代码确实会导致抛出NullReferenceException
。
只需将
async
修饰符添加到第二个声明,它的工作方式与第一个相同。
注意这里没有 lambda 表达式——你的第二个声明是一个 expression-bodied 方法。它只是使用与 lambda 表达式相同的语法 (
=>
)。
尝试:
Func<Task<WordDocument>> frontPage = async () => await GetFrontPage();
protected override async Task<WordDocument> GetFrontPage() => await Task.FromResult<WordDocument>(null);
这对我有用:
protected override async Task<WordDocument> GetFrontPage() => await Task.FromResult<WordDocument>(null);