BUG吗?虫虫吗?
实在不好意思,今天才发现博客园电子期刊第一期.马上下了一个回来拜读.相见恨晚呀.
篇篇精彩,一个也没有错过.
但是我在看这篇文章<<关于枚举的种种>>时,发现一个小错误.请看文章中的一段代码:
// 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
所以我认为正确代码:
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,这句怎么能通过?没有明白,希望有人能够指导.
最后祝福博客园电子期刊红火起来.
"质量第一"是我们出刊的中心原则,希望质量能更上一层楼.
B.MCAD学习
C.代码阅读总结
D.ASP.NET状态管理
E.DB(数据库)
F.WAP
G.WinForm
H.Flex
希望上面提到的知识对您有所提示,同时欢迎交流和指正
作者:aierong
出处:http://www.cnblogs.com/aierong
贴子以"现状"提供且没有任何担保,同时也没有授予任何权利!
本文版权归作者所有,欢迎转载!
原创技术文章和心得,转载注明出处!这也是对原创者的尊重!