也说System.Int32和int


相关文章:

理解C#中的System.In32和int:并非鸡和鸡蛋
为《理解C#中的System.In32和int:并非鸡和鸡蛋 》做个续 

我写作本文的目的,不是为了解释问题,而是,将问题提升一些,顺便加入自己的一些困惑。

首先,System.Int32并没有依赖int。我们知道,System.Int32是.NET Framework提供的基元类型,而int是C#中的一个关键字、是System.Int32的别名、是为了方便C/C++开发者转向C#语言的。

至于定义中的 ... struct Int32 : ..., IComparable<int>, ...,只能说这个类型实现的泛型接口,是以该类型自身作为类型参数的。就好比,你自己写个类A,希望实现IComparable<T>接口,你也会写 class A : IComparable<A>的,并不能说A就“依赖”自身了。如果是 ... struct Int32 : int 这才能说“依赖”了。

简言之,Int32的定义中,类名Int32和IComparable泛型接口的类型参数int是一个东西。但问题在于——为什么Visual Studio和Reflector在反编译时都不约而同地使用int这个别名作为类型参数?

Int32和int,在绝大多数场景下是可以互换的,但有一个场景不行。前面两篇文章的作者都没有提到,那就是,在定义枚举时用作基础类型。

C#中定义枚举时,可以指定枚举使用哪种基本类型,也就是指定在底层究竟用哪种类型来存放枚举值。默认使用int。如果希望使用其他基本类型,可以用诸如 enum Flag : byte 这样的语法。当然,这里的“:”并不表示“继承”和“实现”,只是告诉编译器,在底层用一个字节(byte类型)存放枚举值。

当使用 enum Flag{}来定义枚举时,默认是int;但不妨碍我们使用enum Flag : int{}来进行定义。此时问题就来了,如果换成enum Flag : Int32 {},编译器就会报错,错误信息仅仅是“应输入类型 byte、sbyte、short、ushort、int、uint、long 或 ulong”。此时int与Int32不可替换使用。

小结

本文提出了与 Int32和int 相关的两个问题:
1 VS和Reflector在反编译时为何都不约而同在泛型接口中使用int作为类型实参?
2 为何在定义枚举时不能使用Int32而只能使用int?
posted @ 2007-12-20 17:29  Anders Liu  阅读(4130)  评论(22编辑  收藏  举报