Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么异步扩展方法抛出System.NullReferenceException_C#_Asynchronous_Extension Methods - Fatal编程技术网

C# 为什么异步扩展方法抛出System.NullReferenceException

C# 为什么异步扩展方法抛出System.NullReferenceException,c#,asynchronous,extension-methods,C#,Asynchronous,Extension Methods,我有两种扩展方法,它们做的事情基本相同,但有一种是异步的 public static class ProjectExtensions { public static Layout GetLayout(this Project project) { .. } public static async Task<Layout> GetLayoutAsync(this Project project) { ... } } 这两个

我有两种扩展方法,它们做的事情基本相同,但有一种是异步的

public static class ProjectExtensions
{
   public static Layout GetLayout(this Project project)
   {
      ..
   }

   public static async Task<Layout> GetLayoutAsync(this Project project)
   {
      ...
   }
}

这两个方法实际上都没有被调用,这是我所期望的,但是异步方法抛出了一个null引用异常,这对我来说没有意义,因为null
项目
没有调用任何方法。我知道如果我使用
而不是
并在静态扩展方法中处理null参数,这个问题就会消失,但是这个异常的原因是什么,为什么异步方法不同呢?

wait
需要一个
任务来等待


如果
currentProject
为null,则表达式
currentProject?.getLayoutSync()
将解析为null。等待不能等待空值

等待
需要任务
等待


如果
currentProject
为null,则表达式
currentProject?.getLayoutSync()
将解析为null。等待不能等待null

您当前正在有效地执行
等待(任务)null这不会很好地工作…您的代码本质上是
Task layout1=await null并且你不能等待null。你目前正在有效地执行
等待(任务)null这不会很好地工作…您的代码本质上是
Task layout1=await null并且您不能等待null。
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
}