提问人:Srikrishna Sharma 提问时间:3/1/2023 最后编辑:CharliefaceSrikrishna Sharma 更新时间:3/1/2023 访问量:76
表情主体函数怪异行为
Expression bodied Function Weird Behavior
问:
当我使用
var frontPage = await GetFrontPage();
protected override async Task<WordDocument> GetFrontPage()
{
return null;
}
这段代码工作正常,我在 frontpage 变量中得到了 null 值。但是当我将函数重写为
protected override Task<WordDocument> GetFrontPage() => null;
我得到了一个.NullReferenceException
谁能帮我理解这两种说法之间的区别。?
答:
5赞
Jon Skeet
3/1/2023
#1
谁能帮我理解这两种说法之间的区别。?
您的第一个声明是 ,因此编译器会生成适当的代码,使其返回一个具有结果和方法结果的代码。任务本身不是 null - 其结果是 null。async
Task<WordDocument>
您的第二个声明不是 ,因此它只返回一个 null 引用。任何等待或以其他方式取消引用该 null 引用的代码确实会导致抛出 。async
NullReferenceException
只需将修饰符添加到第二个声明中,它的工作方式将与第一个声明相同。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);
更短、开销更小
评论