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可能没有设置为任何东西,因此它会发出错误.
你default在switch语句中缺少这种情况.如果你写了:
if (decision)
{
toBeAssigned = getValuesA();
}
else if (!decision)
{
toBeAssigned = getValuesB();
}
Run Code Online (Sandbox Code Playgroud)
发生这种情况,因为编译器不知道有多少情况,并且总是假设你没有全部覆盖它们,除非你有一个default声明,基本上是"如果不满足所有其他情况,请执行此操作".这同样适用于if和else:if(...)和else if(...)是你的"的情况:"和else你的"默认"
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |