Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么SWITCH和IF在变量赋值方面不同_C#_Switch Statement - Fatal编程技术网

C# 为什么SWITCH和IF在变量赋值方面不同

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语句,但我越来越喜欢switch-case语句,因为有时候它更可读。 但是我想知道为什么编译器不理解switch以及
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();
}