自从我开始使用.NET以来,这一直是我的一个宠儿,但我很好奇,以防我错过了什么.我的代码片段无法编译(请原谅示例的强制性质),因为(根据编译器)缺少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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我知道我可以简单地放置一个默认语句来摆脱编译器警告,但在我看来,不仅是冗余代码,它的危险代码.如果枚举在另一个文件中并且另一个开发人员出现并将Maybe添加到我的枚举中,它将由我的默认子句处理,该子句对Maybe s 一无所知,并且我们很可能会引入逻辑错误.
然而,如果编译器允许我使用上面的代码,那么它可以识别我们有问题,因为我的case语句将不再覆盖枚举中的所有值.当然听起来对我来说更安全.
这对我来说根本就是错误的,我想知道它是否只是我缺少的东西,还是我们在switch语句中使用枚举时必须非常小心?
编辑: 我知道我可以在默认情况下引发异常或在交换机外添加一个返回,但这仍然是根本不能解决编译错误,这不应该是错误.
关于enum真的只是一个int,这是.NET肮脏的小秘密之一,真的非常令人尴尬.让我声明一个有限数量的可能性的枚举,并给我一个汇编:
Decision fred = (Decision)123;
Run Code Online (Sandbox Code Playgroud)
然后如果有人尝试这样的事情,则抛出异常:
int foo = 123;
Decision fred = (Decision)foo;
Run Code Online (Sandbox Code Playgroud)
编辑2:
有些人对enum在不同的程序集中会发生什么以及如何导致问题发表评论.我的观点是,这是我认为应该发生的行为.如果我更改方法签名,这将导致问题,我的前提是更改枚举应该是相同的.我的印象是很多人都不认为我理解.NET中的枚举.我只是认为这种行为是错误的,我希望有人可能知道一些非常模糊的功能会改变我对.NET枚举的看法.
例如,为什么long int有一个文字修饰符,但是short int不是?我指的是这个网站上的以下问题:C#编译器编号文字
通常,C#似乎是一种设计良好且一致的语言.可能有一个强有力的理由为某些类型提供文字修饰符,但不是所有类型.它是什么?