为什么异步方法返回类型不能从Task派生?

Kim*_*mke 4 c# asynchronous async-await

我有一个班级(简化样本,只显示相关部分)

public class AsyncScenario : Task<Scenario>
{
    public async AsyncScenario Test(Func<Task> action)
    {
        return await this;           
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法编译这个因为方法的返回类型:

编译器错误CS1983:"异步方法的返回类型必须为void,任务或任务<T>"

为什么异步方法不允许返回派生自的类Task<T>

Pet*_*iho 7

因为C#规范是这样说的吗?没有Eric Lippert或其他一些语言设计团队人员,你不会得到更好的答案.其他任何事情都是纯粹的猜测和观点.

也就是说,假设在一个async方法中,return语句暗示了返回值,您认为规范规则在这样的例子中应该是什么?显然await this解析为一个Scenario对象...... C#编译器应该如何AsyncScenario从该表达式类型合成一个新对象?

我想你可能会在规范中提出一些额外的规则,这些规则可以明确地提供一些机制.但在我看来,这些规则将显著比存在的规范,现在矗立,这里的返回类型始终是已知的规格笔者类型和具有明确的规则,用于创建第一次该方法返回的规则更为复杂同样重要的是,改变return执行语句的状态.

在我看来,这些规则很可能存在,只是因为这样做会需要过多的努力,并且会大大增加编译器的复杂性以及所述编译器中出现错误的可能性.


†说到这一点,一点点挖掘挖出金币:为什么异步方法必须返回任务?,由VB.NET语言设计师Lucian Wischik编写(但该文章同样适用于C#).另请参阅Jon Skeet在使用泛型类型作为异步方法的返回类型时的答案.

  • @StephenCleary:我昨天和Lucian共进午餐,他告诉我他仍然在积极地追求这个功能,所以很有可能它会成功.当然没有承诺. (2认同)