希望这不是重复,但这里有5000多个问题,“并非所有代码路径都返回值”!
很简单,为什么这个非泛型实现的方法编译得很好:
public static async Task TimeoutAfter(this Task task, int millisecondsTimeout)
{
if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout)))
await task;
else
throw new TimeoutException();
}
虽然这种尝试使方法通用会产生Return state missing
/ ... not all code paths return a value
警告/错误?:
public static async Task<T> TimeoutAfter<T>(this Task<T> task, int millisecondsTimeout)
{
if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout)))
await task;
else
throw new TimeoutException();
}
答案 0 :(得分:10)
非泛型Task
类型有点等同于等待的void方法。就像void方法一样,不能从返回类型为Task
的方法返回任何内容,这就是第一个示例编译的原因。但是,第二个示例需要泛型类型的返回值,并且您没有在等待另一个调用的路径中提供一个。
引用async
关键字上的MSDN reference,特别是关于返回类型。
如果方法没有返回有意义的值,则使用Task 完成。也就是说,对方法的调用返回一个Task,但是当时 任务完成,任何等待表达式等待任务 评估为无效。
答案 1 :(得分:7)
在第二个例子中,你给了你没有返回任何东西。 (参见Chris Hannon对其原因的回答)。
public static async Task<T> TimeoutAfter<T>(this Task<T> task, int millisecondsTimeout) {
if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout)))
return await task; // return the Task of T
else
throw new TimeoutException();
}
除了@ChrisHannon所说的await documentation。
...如果
await
应用于返回Task<TResult>
的方法调用的结果,则await表达式的类型为TResult
。如果await
应用于返回Task
的方法调用的结果,则await表达式的类型为void
。 ...