c# - 编译器在打开枚举后提示未分配的变量

标签 c# enums switch-statement

我有以下枚举器:

enum Foo { Bar, Baz };

在以下代码中,编译器因错误而中止:

use of unassigned local variable 'str'

The code:

string str;
Foo foo = Foo.Bar;

switch (foo)
{
    case Foo.Bar: str = "a"; break;
    case Foo.Baz: str = "b"; break;
}

str.ToLower();

开关 涵盖了枚举器的所有可能值。但是编译器仍然认为 str 可能未分配。这是为什么?当然,我可以在其中放置一个 default 案例,但那是错误的,因为在编译时不会捕获错误。例如,如果 Foo 枚举稍后被修改并添加了一个新值,然后最好得到一个编译器错误。如果我使用 default 情况,则在重新编译时不会捕获错误。

我想没有办法让编译器接受没有 default case 的 switch and 如果 引发错误Foo 稍后扩展?

最佳答案

I suppose there is no way to get the compiler to accept a switch without a default case and raise an error if Foo is extended later on?

这是正确的。长话短说,编译器这样做的原因是可以分配 foo不是有效值之一的值 enum Foo通过类型转换 int 来获取 s 值, 可以绕过 switch 的所有情况.

我在这种情况下使用的解决方案是添加一个断言:

switch (foo)
{
    case Foo.Bar: str = "a"; break;
    case Foo.Baz: str = "b"; break;
    default: Debug.Assert(false, "An enum value is not covered by switch: "+foo);
}

关于c# - 编译器在打开枚举后提示未分配的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25582771/

相关文章:

c# - ImageButton 图像未调整大小

c# - Visual Studio 2017 单元测试未运行

c# - LINQ 如果 .Any 匹配 .Any

c# - 获取从计算机到手机的通知

c# - 这两个枚举 [Flags] 声明之间有什么区别(C#)

objective-c - 是否可以在与在 Objective-C 中使用它的类头文件相同的文件中定义枚举?

c - 带枚举的 Malloc/Free 会出现段错误 - 简单代码

java - 如何将 ENUM 与 SWITCH 结合使用,进行基于字符串的比较

Java switch 语句多例

Javascript switch 语句在拆分字符串时失败