温馨提示:本文翻译自stackoverflow.com,查看原文请点击:asynchronous - .net compiler error “Not all code paths return a value” on Task method
.net asynchronous compiler-errors task while-loop

asynchronous - .net编译器错误“任务方法”上的“并非所有代码路径都返回值”

发布于 2020-04-22 15:01:27

我已经在实践中学习了Task在.net中的工作方式,但是我对它的含义有些困惑。重构旧代码时,我碰巧在我的一个类中有以下未完成的代码:

    private Task StartDataCollection()
    {
         // Some other code here but no Task.Run()
    }

当然,编译器会抱怨:

错误CS0161 ...:并非所有代码路径都返回一个值

然后我在代码中添加了一个while循环,如下所示,编译器错误消失了:

    private Task StartDataCollection()
    {
         while(true)
         {
         }
    }

出于好奇,我更改了while循环,如下所示,编译器再次抱怨相同的错误:

    private Task StartDataCollection()
    {
         while(false)
         {
         }
    }

这真是让我感到困惑。如果编译器因为没有return语句(或诸如Task.Run()之类的其他东西)而抛出Error CS0161,那么为什么while(true)可以解决它?这是否意味着在后台运行while(true)循环运行Task?我不这样认为。。。也许我在这里遗漏了一点。

查看更多

提问者
Ramin Toussi
被浏览
68
2020-02-06 19:54

CS0161的真正含义不是真正地“是否所有可能的代码路径都返回一个值”,而是:“是否存在某种方式到达方法末尾且不返回值的代码路径”。编译器正在巧妙地检测到,while (true)如果没有a,break则循环是无法退出,因此在之后必须继续执行while:因此,无法到达方法的结尾。所以:从编译器的角度来看,它没有做错任何事情

当然,这仍然是非常错误的。

注意:如果添加:

static bool AlwaysTrue() => true;

并更改为while (AlwaysTrue()),它现在会给您一个CS0161错误,因为这种对未退出循环的检测是特定于常量表达式的,可以简单地将其求值为true

它与Task在后台运行a无关如果您具有intstring作为返回类型,它将执行相同的操作


同样,如果执行以下操作,则会发出CS0162警告(检测到无法访问的代码):

while (false)
{
    Console.WriteLine("Hi");
}