为什么SWITCH和IF在变量分配方面有所不同

Chr*_*uer 3 c# switch-statement

我目前大多数时候都在使用IF语句,但我越来越喜欢switch case语句,因为有时候它更具可读性.但我想知道为什么编译器不理解开关以及if.一个例子:

bool decision = false;
IEnumerable<string> toBeAssigned;

if (decision)
{
   toBeAssigned = getValuesA();
}
else
{
   toBeAssigned = getValuesB();
}

foreach (var elem in toBeAssigned )
{
       // do something
}
Run Code Online (Sandbox Code Playgroud)

这应该编译好,并且toBeAssigned可以在foreach中使用而没有问题.

但:

bool decision = false;
IEnumerable<string> toBeAssigned;

switch(decision)
{
  case true:       
     toBeAssigned = getValuesA();
     break;
  case false:       
     toBeAssigned = getValuesB();
     break;
}

foreach (var elem in toBeAssigned )
{
// do something
}
Run Code Online (Sandbox Code Playgroud)

不为我编译 - 编译器抱怨从未分配toBeAssigned的值.由于两者都应该编译为相同的IL,我很好奇为什么编译器以不同的方式处理这两种情况.

Bat*_*eba 11

您的if陈述涵盖了所有可能的情况,但编译器没有意识到这样switch做:您错过了一个default案例.

编译器认为toBeAssigned可能没有设置为任何东西,因此它会发出错误.


Mar*_*lov 8

default在switch语句中缺少这种情况.如果你写了:

if (decision)
{
   toBeAssigned = getValuesA();
}
else if (!decision)
{
   toBeAssigned = getValuesB();
}
Run Code Online (Sandbox Code Playgroud)

发生这种情况,因为编译器不知道有多少情况,并且总是假设你没有全部覆盖它们,除非你有一个default声明,基本上是"如果不满足所有其他情况,请执行此操作".这同样适用于ifelse:if(...)else if(...)是你的"的情况:"和else你的"默认"