12

希望这不是重复,但这里有 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();
    }
4

2 回答 2

11

非泛型Task类型在某种程度上等同于可等待的 void 方法。就像 void 方法一样,您不能从返回类型为 的方法返回任何内容Task,这就是第一个示例编译的原因。但是,第二个示例需要一个泛型类型的返回值,并且您没有在等待另一个调用的路径中提供一个返回值。

引用关键字的MSDN 参考,特别是关于返回类型。async

如果在方法完成时没有返回有意义的值,则使用 Task。也就是说,对该方法的调用会返回一个 Task,但是当 Task 完成时,任何等待 Task 的 await 表达式的计算结果都为 void。

于 2012-08-24T19:13:01.153 回答
8

在您提供的第二个示例中,您没有返回任何内容。(有关原因,请参阅 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 文档

...如果await应用于返回 a 的方法调用的结果Task<TResult>,则 await 表达式的类型是TResult。如果await应用于返回 a 的方法调用的结果Task,则 await 表达式的类型为void。...

于 2012-08-24T19:09:01.890 回答