我想知道为什么到枚举值的单个隐式转换的工作方式与转换到系统类型时的工作方式不同。我看不出任何技术原因,但也许比我聪明的人可以为我提供一些启示。
以下无法编译,"A value of an integral type expected"
and "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;
}
}
edit从规范:
switch 语句的控制类型由 switch 表达式确定。如果 switch 表达式的类型是sbyte、byte、short、ushort、int、uint、long、ulong、char、string 或枚举类型,那么这就是 switch 语句的控制类型。否则,必须存在从 switch 表达式的类型到以下可能的控制类型之一的用户定义的隐式转换(第 6.4 节):sbyte、字节、短、ushort、int、uint、long、ulong、char、字符串。如果不存在此类隐式转换,或者存在多个此类隐式转换,则会发生编译时错误。
为了澄清这个问题,为什么枚举类型不包含在允许的列表中用户定义的隐式转换s?
语言设计说明存档没有提供此决定的理由。这是不幸的,因为决定改变了。正如您所看到的,设计随着时间的推移而演变:
1999 年 5 月 26 日的笔记:
允许哪些类型作为
switch 语句的参数?
整型包括 char、enum
类型,布尔。 C# 也允许类型
这可以隐含地并且
明确转换为其中之一
上述类型。 (如果有
多次隐式转换,那么它的
不明确且编译时错误
发生。)我们不确定我们是否
是否支持字符串。
1999 年 6 月 7 日:
我们讨论了启用字符串开关
论据。我们认为这是一个很好的
特性——语言可以增加价值
通过使这种常见情况更容易
写,以及额外的复杂性
对于用户来说是非常低的。
1999 年 12 月 20 日:
开机是违法的
bool 类型的表达式。这是合法的
打开 a 的表达式
整型或字符串类型。这是
打开 a 的表达式是合法的
只具有一个隐式的类型
转换为整型或
字符串类型。
这里我们第一次出现了相关规则。枚举似乎已经消失了。为什么不使用用户定义的隐式转换为枚举?这只是一个疏忽吗?设计师没有记录他们的想法。
请注意,第一句话不是我们实现的。我不清楚为什么实施者的做法与设计委员会的建议相反。几年后,这一点在笔记中再次出现:
2003 年 8 月 13 日:
编译器允许在 bool 上进行切换。
不想记录并添加它
到语言。不想删除
出于兼容性原因。决定了
默默继续支持switch
在布尔上。
我觉得这很愚蠢;当我们制作 C# 3.0 规范的带注释的印刷版时,我将 bool (和 bool?) 添加到合法管理类型列表中。
简而言之:整个事情有点混乱。我不知道为什么枚举先输入,然后输出,然后半进半出。这可能仍然是未知之谜之一。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)