c# – 当处理枚举时,没有默认的切换语句

这是我从我开始使用.NET的宠物peeve,但我很好奇,如果我缺少的东西。我的代码片段不会编译(请原谅样本的强制性质),因为(根据编译器)缺少return语句:

public enum Decision { Yes, No}

    public class Test
    {
        public string GetDecision(Decision decision)
        {
            switch (decision)
            {
                case Decision.Yes:
                    return "Yes, that's my decision";
                case Decision.No:
                    return "No, that's my decision";

            }
        }
    }

现在我知道我可以简单地放置一个默认语句来摆脱编译警告,但在我看来,不仅是冗余代码,它的危险代码。如果枚举是在另一个文件中,另一个开发人员来到并添加Maybe到我的枚举,它将由我的默认子句处理,它不知道Maybes什么,有一个很好的机会,我们引入一个逻辑错误。

然而,如果编译器让我使用我的代码上面,它可以确定我们有一个问题,因为我的case语句将不再涵盖所有的值从我的枚举。当然听起来对我来说更安全。

这对我来说基本上是错误的,我想知道它是否是我缺少的东西,或者当我们在switch语句中使用枚举时,我们只需要非常小心!

编辑:
我知道我可以在默认情况下提出异常或添加一个返回外面的开关,但这仍然是根本上黑客来绕过一个编译器错误,不应该是一个错误。

关于一个枚举真的只是一个int,这是一个.NET的脏的小秘密,这是非常尴尬真的。让我宣布一个有限数量的可能性的枚举,并给我一个汇编:

Decision fred = (Decision)123;

然后抛出异常,如果有人尝试类似:

int foo = 123;
Decision fred = (Decision)foo;

编辑2:

有几个人对当枚举在不同程序集中时会发生什么以及如何导致问题进行评论。我的观点是,这是我认为应该发生的行为。如果我改变方法签名这将导致问题,我的前提是更改枚举应该是相同的。我得到的印象是,很多人不认为我理解.NET中的枚举。我只是认为行为是错误的,我希望有人可能已经知道一些非常模糊的功能,这将改变我对.NET枚举的意见。

最佳答案
哎呀,情况远比只是处理枚举差。我们甚至不为bools做这个!

public class Test {        
  public string GetDecision(bool decision) {
    switch (decision) {
       case true: return "Yes, that's my decision";                
       case false: return "No, that's my decision"; 
    }
  }
}

生成相同的错误。

即使你解决了枚举能够承担任何价值的所有问题,你仍然会有这个问题。语言的流分析规则根本不考虑没有默认的交换机是所有可能的代码路径的“穷尽”,即使你和我知道他们是。

我想非常地解决这个问题,但坦率地说,我们有更多的优先级,比修复这个愚蠢的小问题,所以我们从来没有得到它。

转载注明原文:c# – 当处理枚举时,没有默认的切换语句 - 代码日志