C# 为什么这个异步/等待代码会生成“;。。。并非所有代码路径都返回一个值";?
希望这不会重复,但这里有5000多个问题“并非所有代码路径都返回值” 很简单,为什么这个非泛型实现的方法编译得很好: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;
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();
}