【发布时间】:2014-05-29 17:32:14
【问题描述】:
上一个问题让我想知道为什么下面的方法会引发编译时错误:
async 方法的返回类型必须为 void、Task 或 Task
public async T MyMethodAsync<T>() where T : Task
{
// Irrelevant code here which returns a Task
}
既然我们在编译时知道 T 始终是 Task 或派生类型,为什么这不起作用?
编辑
我问的原因是方法可能返回Task 或Task<T>。假设该方法可以返回任何一个并且我不想重复代码。
当然,这都是理论上的,并非用于生产目的。
编辑 2
找到了 Lucian Wischik 的一篇很棒的文章: Why must async return Task
【问题讨论】:
-
你的意思是让它成为一个通用方法吗?
-
您是否错过了函数的通用定义?应该是
MyMethodAsync<T>()。您还返回T还是Task?如果您返回后者,您只需将返回类型设为Task。 -
我不确定编译器是否有理由拒绝这一点,但退后一步我不得不想知道为什么带有
where T : AnySpecificType的泛型首先需要是泛型的。 -
例如返回类型可能是
Task<T> -
@YuvalItzchakov:请尝试编写一个对
T=Task和T=Task<string>都有效的方法体。
标签: c# .net generics async-await