C# 为什么SWITCH和IF在变量赋值方面不同
我目前大部分时间都在使用IF语句,但我越来越喜欢switch-case语句,因为有时候它更可读。 但是我想知道为什么编译器不理解switch以及C# 为什么SWITCH和IF在变量赋值方面不同,c#,switch-statement,C#,Switch Statement,我目前大部分时间都在使用IF语句,但我越来越喜欢switch-case语句,因为有时候它更可读。 但是我想知道为什么编译器不理解switch以及if。 例如: bool decision = false; IEnumerable<string> toBeAssigned; if (decision) { toBeAssigned = getValuesA(); } else { toBeAssigned = getValuesB(); } foreach (var e
if
。
例如:
bool decision = false;
IEnumerable<string> toBeAssigned;
if (decision)
{
toBeAssigned = getValuesA();
}
else
{
toBeAssigned = getValuesB();
}
foreach (var elem in toBeAssigned )
{
// do something
}
bool决策=false;
i可数tobeasigned;
如果(决定)
{
toBeAssigned=getValuesA();
}
其他的
{
toBeAssigned=getValuesB();
}
foreach(待签名的可变元素)
{
//做点什么
}
这应该可以很好地编译,并且toBeAssigned可以毫无问题地在foreach中使用
但是:
bool决策=false;
i可数tobeasigned;
转换(决定)
{
大小写正确:
toBeAssigned=getValuesA();
打破
案例错误:
toBeAssigned=getValuesB();
打破
}
foreach(待签名的可变元素)
{
//做点什么
}
不为我编译-编译器抱怨toBeAssigned的值从未分配。
既然两者都应该编译为相同的IL,我很好奇为什么编译器会对这两种情况采取不同的处理方式。您的
if
语句涵盖了所有可能的情况,但编译器没有意识到开关也会这样做:您缺少了默认值情况
编译器认为有可能未将tobeasigned
设置为任何值,因此发出错误。您的switch语句中缺少默认值的大小写。如果您写了以下内容,也会发生同样的情况:
if (decision)
{
toBeAssigned = getValuesA();
}
else if (!decision)
{
toBeAssigned = getValuesB();
}
这种情况会发生,因为编译器不知道有多少情况,并且总是假设您没有涵盖所有情况,除非您有一个default
语句,该语句基本上是“如果所有其他情况都不满足,请执行此操作”。这同样适用于if
和else
:if(…)
和else if(…)
是您的“case:”和else
是您的“default:”带开关编译器的编译器不知道您的case
是详尽无遗的。它无法证实这一事实。因此,由于您的开关中没有默认值
,因此它认为有一种方法可以在未分配时进行分配。添加default
case而不是false
,它会起作用。稍微偏离主题,关于您引用的具体案例:switch
在有两个以上的潜在选项时是有意义的,但是,当只有两个结果时,我建议if
版本更具可读性。
if (decision)
{
toBeAssigned = getValuesA();
}
else if (!decision)
{
toBeAssigned = getValuesB();
}