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

标签 c# switch-statement

我目前大部分时间都在使用 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
}

这应该可以正常编译,并且可以毫无问题地在 foreach 中使用 toBeAssigned。

但是:

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,我很好奇为什么编译器会以不同的方式处理这两种情况。

最佳答案

您的 if 语句涵盖了所有可能的情况,但编译器没有意识到 switch 也这样做:您缺少 default案例。

编译器认为 toBeAssigned 可能未设置任何值,因此会发出错误。

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

相关文章:

c# - 浏览器可以访问 web 服务,但我的 C# 应用程序获取 "Could not establish trust relationship"

c# - ASP.NET MVC 核心/6 : Multiple submit buttons

java - 我的 java 循环出现问题

c# - '||' switch 语句中两个枚举之间使用的运算符

javascript - 我可以使用 switch 语句来管理 React 中的表单吗?

c# - 如何对 FileContentResult 进行单元测试?

c# - ConcurrentDictionary 陷阱 - 来自 GetOrAdd 和 AddOrUpdate 的委托(delegate)工厂是否同步?

c# - 如何为我的 Azure 应用程序创建应用程序 token ?

c - 使用 switch 语句查看数字落入哪个 'bin'

c - 关于 C 中的 switch{} 大小写?