BUG吗?虫虫吗?

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 15:52   3435   0

实在不好意思,今天才发现博客园电子期刊第一期.马上下了一个回来拜读.相见恨晚呀.
篇篇精彩,一个也没有错过.

但是我在看这篇文章<<关于枚举的种种>>时,发现一个小错误.请看文章中的一段代码:

// Code #13
// See Code #01 for Alignment.
public static void Main()
{
IConvertible ic
= (IConvertible)Alignment.Center;
int i = ic.ToInt32(null);
Console.WriteLine(
"The value of Alignment.Center is {0}.", i);
}


// Output:
// The value of Alignment.Center is 1.

这段代码编译会出错误.系统是无法将类型“Alignment”转换为“System.IConvertible”
我们都知道枚举是值类型,枚举的父类是System.Enum,它是一个抽象类.引用类型.
它实现了3个接口IConvertible,IComparable, IFormattable

所以我认为正确代码:

IConvertible ic = (System.Enum)Alignment.Center;
int i = ic.ToInt32( null );
Console.WriteLine(
" The value of Alignment.Center is {0}. " , i);

说明:应该把枚举先装箱为它的父类,再调用父类的接口方法.
同时我用.net reflector看了IL代码,证明我的想法是正确的.
.method private hidebysig static void Main(string[] args) cil managed
{
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
.entrypoint
// Code Size: 32 byte(s)
.maxstack 2
.locals (
[mscorlib]System.IConvertible convertible1,
int32 num1)
L_0000: ldc.i4.1
L_0001: box ConsoleApplication1.Alignment
L_0006: stloc.0
L_0007: ldloc.0
L_0008: ldnull
L_0009: callvirt instance int32 [mscorlib]System.IConvertible::ToInt32([mscorlib]System.IFormatProvider)
L_000e: stloc.1
L_000f: ldstr "The value of Alignment.Center is {0}."
L_0014: ldloc.1
L_0015: box int32
L_001a: call void [mscorlib]System.Console::WriteLine(string, object)
L_001f: ret
}

但是我看它转化后的C#代码:
private static void Main(string[] args)
{
IConvertible convertible1 = Alignment.Center;
int num1 = convertible1.ToInt32(null);
Console.WriteLine("The value of Alignment.Center is {0}.", num1);
}

说明:IConvertible convertible1 = Alignment.Center,这句怎么能通过?没有明白,希望有人能够指导.

最后祝福博客园电子期刊红火起来.
"质量第一"是我们出刊的中心原则,希望质量能更上一层楼.

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP