繁体   English   中英

为什么这个async / await代码生成“...并非所有代码路径都返回一个值”?

[英]Why does this async / await code generate “…not all code paths return a value”?

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

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

引用async关键字上的MSDN引用 ,特别是有关返回类型的引用

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

在第二个例子中,你给了你没有返回任何东西。 (参见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应用于返回Task<TResult>的方法调用的结果,则await表达式的类型为TResult 如果将await应用于返回Task的方法调用的结果,则await表达式的类型为void ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM