C# 为什么这个异步/等待代码会生成“;。。。并非所有代码路径都返回一个值";?

C# 为什么这个异步/等待代码会生成“;。。。并非所有代码路径都返回一个值";?,c#,asynchronous,task-parallel-library,async-await,c#-5.0,C#,Asynchronous,Task Parallel Library,Async Await,C# 5.0,希望这不会重复,但这里有5000多个问题“并非所有代码路径都返回值” 很简单,为什么这个非泛型实现的方法编译得很好: public static async Task TimeoutAfter(this Task task, int millisecondsTimeout) { if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout))) await task;

希望这不会重复,但这里有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();
    }
虽然这种使方法泛型的尝试会生成一个
返回状态missing
/…
但并非所有代码路径都返回一个值
警告/错误?:

    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();
    }
public static async Task TimeoutAfter(此任务任务,int毫秒)
{
if(task==wait task.wheny(task,task.Delay(毫秒计时)))
等待任务;
其他的
抛出新的TimeoutException();
}

在您给出的第二个示例中,您没有返回任何内容。(参见Chris Hannon的答案了解原因)

public static async Task TimeoutAfter(此任务任务,int毫秒){
if(task==wait task.wheny(task,task.Delay(毫秒计时)))
return wait task;//返回T的任务
其他的
抛出新的TimeoutException();
}
除了@ChrisHannon所说的,从

。。。如果将
await
应用于返回
任务的方法调用的结果,则await表达式的类型为
TResult
。如果将
wait
应用于返回
任务的方法调用的结果,则wait表达式的类型为
void


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

async
关键字上引用,特别是关于返回类型

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


@L.B*“应该返回
Task
,并且……我的理解是,wait表达式的值应用于返回值,因此它并不等同于返回Void,但是wait本身就是
System.Void
。确实,该方法隐式返回一个
任务,然后您可以等待它。它相当于void,因为不允许您自己从该方法返回值,并且等待该方法的结果不能赋值。在
任务
的情况下,您返回的
T
将从等待中分配(例如
var value=wait SomeCall();
)。谢谢,解释得很好。现在这完全有道理了,但一开始,这个结构的抽象层让我感到不舒服。谢谢,大卫。我很欣赏这个例子。
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();
}