并非所有代码路径都返回一个值 - 但它们确实存在

时间:2012-03-30 08:46:55

标签: c# .net compiler-errors value-type

以下代码摘录无法编译,导致not code paths return a valueTest1StandardChargeCalculatorTest2StandardChargeCalculator这两种类型都是从返回类型派生的。

我知道如何解决此问题,但我的问题是我为什么要这样做? bool是值类型 - 因此只能表示 true false ,这两个都在此代码段中得到满足。那么为什么编译失败呢?

internal StandardChargeCalculator Create()
{
      bool value = true;

      switch (value)
      {
          case true:
              return new Test1StandardChargeCalculator();
          case false:
              return new Test2StandardChargeCalculator();
      }
} //not all code paths return a value

5 个答案:

答案 0 :(得分:15)

使用switch语句时,编译器不明白当您使用布尔类型打开时,只能有两个结果。

发生错误是因为您没有默认案例。

不要使用switch进行布尔测试 - 使用if语句:

  bool value = true;

  if(value)
  {
      return new Test1StandardChargeCalculator();
  }

  return new Test2StandardChargeCalculator();

答案 1 :(得分:4)

为什么你认为编译器应该使用特殊情况布尔值并检测所有可能的值都有case语句?

如果你正在编写编译器,你会投入开发工作并通过实现这个来增加bug的风险吗?

答案 2 :(得分:4)

Absence of evidence is not evidence of absence中,Eric Lippert撰写了关于“证明”变量未分配以及编译器在这方面目标较弱的局限性:

  

我们没有兴趣证明x是未分配的。   我们有兴趣证明确定了x!如果我们可以   证明,确定,然后x是“明确分配”。如果我们做不到   证明确定,然后x“未明确分配”。

这并没有直接解释这个例子,但请注意它与以下问题相同:

int x;

if (a < 10) 
   x = 0;
else if (a >= 10)
   x = 1;

y = x; // x is 'unassigned'

我们可以很快看到x将始终被分配,编译器甚至不会尝试查找。

答案 3 :(得分:0)

根据我的理解,它与开关的定义不一致,即:

  

如果没有case表达式与switch值匹配,则控制转移到可选的默认标签后面的语句。如果没有默认标签,则控制权转移到交换机外部。

你是对的:应该没有编译器错误。所以,这可能是答案没有答案的情况。你将不得不忍受它。

    switch (answer)
    {
    ...
    default:
    return "It is as it is"
    }

答案 4 :(得分:-3)

也许更好的解决方案是

internal StandardChargeCalculator Create()
{
  StandardChargeCalculator result = null;
  bool value = true;

  switch (value)
  {
    case true:
      result = new Test1StandardChargeCalculator();
      break;
    case false:
      result = new Test2StandardChargeCalculator();
      break;
  }
  return result;
}