Yuv*_*kov 10 .net c# generics async-await
之前的一个问题让我想知道为什么以下方法会引发编译时错误:
异步方法的返回类型必须为void,Task或Task
public async T MyMethodAsync<T>() where T : Task
{
// Irrelevant code here which returns a Task
}
Run Code Online (Sandbox Code Playgroud)
既然我们在编译时知道T总是一个Task或派生类型,为什么这不起作用呢?
编辑
我问的原因是方法可能返回a Task或a Task<T>.假设该方法可以返回,我不想重复代码.
当然,这完全是理论上的,而不是用于生产目的.
编辑2
Lucian Wischik发现了一篇很棒的文章: 为什么必须异步返回Task
Jon*_*eet 13
三个问题:
仅仅因为T" Task或派生类型"并不意味着它是Task或Task<T>.如果我打电话来自MyMethodAsync<MyCustomTask>哪里,你会期待什么?MyCustomTaskTask
编译器需要知道它是在构建状态机Task还是Task<T>在编译方法时 - 它在不同情况下使用不同的辅助类
如果异步方法的返回类型为Task,则任何return语句都不能指定值; 如果它具有Task<T>任何return语句的返回类型,则必须指定一个可隐式转换为的值T.怎么能在里面工作MyMethodAsync?这有点像说"我的方法是void或者返回T- 你可以决定何时调用它".
目前还不清楚你在这里想要达到的目标,但基本上这不会起作用.
| 归档时间: |
|
| 查看次数: |
3134 次 |
| 最近记录: |