为什么异步扩展方法会抛出 System.NullReferenceException
Why does async extension method throw System.NullReferenceException
我有两种扩展方法,几乎做同样的事情,但一种是异步的
public static class ProjectExtensions
{
public static Layout GetLayout(this Project project)
{
..
}
public static async Task<Layout> GetLayoutAsync(this Project project)
{
...
}
}
我正在使用 .?
运算符,因为如果项目为空,我不想调用这些方法:
public async Task<Layout> GetMapFrameLocator()
{
Project currentProject = Project.Current; // this can be null
var layout1 = await currentProject?.GetLayoutAsync(); // throws!
var layout2 = currentProject?.GetLayout(); // works fine
}
这两个方法实际上都没有被调用,这是我所期望的,但是异步方法抛出一个空引用异常,这对我来说没有意义,因为没有任何东西被调用为空 Project
。我知道如果我使用 .
而不是 .?
并在静态扩展方法中处理 null 参数,这个问题就会消失,但是这个异常的原因是什么?为什么异步方法不同?
await
需要 Task
等待。
如果您的 currentProject
为空,则表达式 currentProject?.GetLayoutAsync()
将解析为空。 await 不能等待 null
我有两种扩展方法,几乎做同样的事情,但一种是异步的
public static class ProjectExtensions
{
public static Layout GetLayout(this Project project)
{
..
}
public static async Task<Layout> GetLayoutAsync(this Project project)
{
...
}
}
我正在使用 .?
运算符,因为如果项目为空,我不想调用这些方法:
public async Task<Layout> GetMapFrameLocator()
{
Project currentProject = Project.Current; // this can be null
var layout1 = await currentProject?.GetLayoutAsync(); // throws!
var layout2 = currentProject?.GetLayout(); // works fine
}
这两个方法实际上都没有被调用,这是我所期望的,但是异步方法抛出一个空引用异常,这对我来说没有意义,因为没有任何东西被调用为空 Project
。我知道如果我使用 .
而不是 .?
并在静态扩展方法中处理 null 参数,这个问题就会消失,但是这个异常的原因是什么?为什么异步方法不同?
await
需要 Task
等待。
如果您的 currentProject
为空,则表达式 currentProject?.GetLayoutAsync()
将解析为空。 await 不能等待 null