Cou*_*y D 4 c# enums switch-statement
我想知道为什么单个隐式转换为枚举值的方式与转换为系统类型时的方式不同.我看不出任何技术上的原因,但也许有人比我更聪明,能给我带来一些启示.
后续编译无法编译,"A value of an integral type expected"和"Cannot implicitly convert type 'Test.En' to 'Test.Foo".
void test1 (){
Foo f = new Foo();
switch (f) // Comment this line to compile
//switch ((En)f) // Uncomment this line to compile
{
case En.One:
break;
}
}
//////////////////////////////////////////////////////////////////
public enum En
{
One,
Two,
Three,
}
public class Foo
{
En _myEn;
public static implicit operator En(Foo f)
{
return f._myEn;
}
}
Run Code Online (Sandbox Code Playgroud)
从规范编辑:
switch语句的控制类型由switch表达式建立.如果switch表达式的类型是sbyte,byte,short,ushort,int,uint,long,ulong,char,string或enum-type,那么这就是switch语句的控制类型.否则,从switch表达式的类型到以下可能的控制类型之一,必须存在一个用户定义的隐式转换(第6.4节):sbyte,byte,short,ushort,int,uint,long,ulong,char,string.如果不存在此类隐式转换,或者存在多个此类隐式转换,则会发生编译时错误.
为了澄清这个问题,为什么枚举类型不包含在允许的用户定义的隐式转换列表中?
语言设计说明存档不能为此决策提供理由.这是不幸的,因为决定已经改变.如您所见,设计随着时间的推移而发展:
1999年5月26日的笔记:
允许哪些类型作为switch语句的参数?整数类型包括char,enum类型,bool.C#还允许可以隐式和明确地转换为上述类型之一的类型.(如果存在多个隐式转换,则会发生其模糊和编译时错误.)我们不确定是否要支持字符串.
1999年6月7日:
我们讨论了启用字符串参数的开关.我们认为这是一个很好的功能 - 语言可以通过使这种常见情况更容易编写来增加价值,并且用户的额外复杂性非常低.
1999年12月20日:
打开bool类型的表达式是违法的.打开整数类型或字符串类型的表达式是合法的.打开一个类型的表达式是合法的,该表达式只有一个隐式转换为整数类型或字符串类型.
在这里,我们首次出现了相关规则.Enum似乎已经消失了.为什么不使用用户定义的隐式转换来枚举?这只是一个疏忽吗?设计师没有记录他们的想法.
请注意,第一句话不是我们实施的.我不清楚为什么实现者与设计委员会推荐的相反.几年之后,这在笔记中又出现了:
2003年8月13日:
编译器允许切换bool.不想记录此内容并将其添加到语言中.出于兼容性原因,不希望将其删除.决定默默地继续支持切换bool.
我觉得这很傻; 当我们制作C#3.0规范的注释印刷版时,我将bool(和bool?)添加到法律管理类型列表中.
简而言之:整件事情有点混乱.我不知道为什么枚举进入,然后出局,然后是半成半.这可能必须是未知之谜之一.