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

bool decision = false;
IEnumerable<string> toBeAssigned;

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

foreach (var elem in toBeAssigned )
{
       // do something
}

这应该可以很好地编译并且 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
}

不为我编译 - 编译器提示从未分配 toBeAssigned 的值。
由于两者都应该编译为相同的 IL,我很好奇为什么编译器会以不同的方式对待这两种情况。

最佳答案

您在 switch 语句中缺少 default 大小写。如果你写了同样的事情也会发生:

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

发生这种情况,因为编译器不知道有多少情况,并且总是假设您没有涵盖所有情况,除非您有一个 default 语句,该语句基本上说“如果不满足所有其他情况,请执行此操作”。 ifelse 也是如此:if(...)else if(...) 是你的“case:”,else 是你的“default:”

关于c# - 为什么 SWITCH 和 IF 在变量分配方面存在差异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20607781/

10-11 22:36
查看更多