首页 新闻 会员 周边

小小枚举的烦恼

0
悬赏园豆:50 [已解决问题] 解决于 2010-01-31 12:27

using System;

public enum Color
{
   Red,
   Green,
   Blue
}

public class TestEnum
{
   static void Main()
    {
       Color c = (Color)1;  //(1)
       Console.WriteLine(c);
       Color c = (Color)5;  //(2)
       Console.WriteLine(c);
    }
}

 

//由以上的强制类型转换在其背后究竟是什么决定了它能否转换成功
//如果说由枚举的基础类型取值范围决定从整形到枚举类型的强制转换是否能够成功的话:

问题:
//1.>那么将整数5转换为枚举类型当打印时为什么还会显示5呢?为什么不能打印枚举值呢?
//2.>在强制类型转换的背后,编译器究竟是怎样执行的呢?
//以上两点请您详细的给于答复,我的脑子反映有点慢!谢了。

问题补充: @vons: @第一控制.NET: 感谢您给我纠正了一个错误,Color name = (Color)5; 我一定改正。 正如您所讲,枚举的每个成员都是一个int的带名字的常量,那么我使用强制类型转换所生成的name它是枚举成员吗?答案我感觉肯定是,不然编译器绝对报错!但是为啥它不能象Red那样输出一个字符串呢?是因为我所使用的int值超出了该枚举类型的枚举成员的界限了吗?也就是说在该枚举类型中没有与这个int值相对应的枚举成员,所以在输出时象 "@第一控制.NET" 所说那样调用了自身的ToString()方法打印了一个"5"。 由于我的基础较差请各位高手费心指点,谢谢了!!
shuzhiguolu的主页 shuzhiguolu | 初学一级 | 园豆:32
提问于:2010-01-29 15:08
< >
分享
最佳答案
0

你的例子和下面的是一样的:

public enum Color
{
   Red=1,
   Green=2,
   Blue=3
}

 

其实枚举的值本身就是int的。

 

这个枚举通过自身的一个方法返回的就是int,所以转不转是一样的。

 

你也许编译过上面的代码(上面的代码通不过,下面的c要换个名字),发现为什么上面输出是Red而下面的是5,因为如下楼说的,Console.WriteLine方法调用了c.ToString(),因为1对应Red,所以输出了Red,而5没有对应,还是输出5。

 

枚举不是这样用的,要Console.WriteLine(Color.Red);这样用。你那样只是玩着把戏的用int

收获园豆:50
vons | 小虾三级 |园豆:1033 | 2010-01-29 15:15
详细的东西三言两语也说不清,想弄的明明白白,攻读《CLR Via C#》吧 :)
vons | 园豆:1033 (小虾三级) | 2010-01-29 15:32
2.>在强制类型转换的背后,编译器究竟是怎样执行的呢? 编译器不执行,而是编译成IL(中间语言),运行的时候由CLR来转换。找本上面的书来看吧,里面都有讲到。
vons | 园豆:1033 (小虾三级) | 2010-01-29 15:44
其他回答(3)
0

楼上正解,补充一句打印的时候tostring了。

第一控制.NET | 园豆:1245 (小虾三级) | 2010-01-29 15:21
0

楼上和楼上的楼上均为正解

查尔斯 | 园豆:3832 (老鸟四级) | 2010-01-30 01:28
0

都什么啊,这个是从C++就开始的东西,跟那个CLR毛关系没一个。要看也是要看枚举最后存储的到底是什么,而不是什么CLR

BLoodMaster | 园豆:135 (初学一级) | 2012-03-16 16:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册