是否有可能有C#异步方法返回类型是不是任务<T>或无效?

看来任何实现GetAwaiter需求的对象都可以等待, Task<>类型只是满足这个需求的许多可能的类型之一。 然而,就我所知,一个async方法似乎只能返回Task<>void 。 是否有可能连接我的自定义任务一样的等待类型,所以我可以指定我的自定义类型作为异步返回类型,当然,我可以随后链接通常调用链的await 。 像这样的东西:(伪代码)

 async MyAwaitable MyAwaitableMethod() { await myAwaitable; } async Task MyTask() { await MyAwaitableMethod(); } 

背景信息 :整个想法实际上源于C ++ 1z / 2x协程提案,它基本上具有相同的基本模型,但是允许在定义任何具有嵌入的promise_type类型中进行更多的控制,从协程返回(作为co_await后果)。

[编辑]

除了答案中提供的链接之外,我还在以下链接中找到了更多的信息,这似乎确实引起了一些关于此主题的热烈讨论:

  1. https://github.com/dotnet/roslyn/issues/7169
  2. https://github.com/dotnet/roslyn/issues/10902
  3. https://github.com/ljw1004/roslyn/blob/features/async-return/docs/specs/feature%20-%20arbitrary%20async%20returns%20-%20discussion.md

[EDIT2]

令人惊讶的是,经过一些进一步挖掘,这实际上是C#7.0的一个预期功能: http : //intellitect.com/generalized-async-return-types/

您想要的功能不存在。 有人提出,我相信有一个原型实现。 看到

https://github.com/dotnet/roslyn/issues/16476

为设计笔记。

如果你感兴趣的话,考虑一下Kotlin的一个通用协程的设计。 这里好东西

https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md