这个问题涉及到枚举的铸造泛型方法C#铸造枚举
给定一个枚举
public enum Crustaceans
{
Frog = 1,
Toad = 4
}
我可以创建枚举的实例足够简单
short val = 4;
Crustaceans crusty = (Crustaceans) val;
内但是,如果
short val = 4;
object obj = (object) val;
Crustaceans crusty = (Crustaceans)obj;
尝试执行硬壳初始化时抛出运行时异常。
任何人都可以解释为什么会发生这种情况,以及为什么做这样的事情是不合法的。
不是我真的很想这样做,但是当我尝试获得与泛型相似的事情时,我发现了一个问题,并且有效地发生了这种情况。即
public T dosomething<T>(short val) where T : new()
{
T result = (T)(object) val;
return result;
}
那么什么,我试图做的是有与枚举和非枚举(不是那么关键,但将是很好),可以设置为短值工作没有抛出异常的通用功能并实际初始化正确的枚举值。
难道是脱节指出,青蛙和蟾蜍不是甲壳类动物?:) – JTMon 2012-08-16 08:01:49
可能重复[为什么我不能取消一个int作为小数?](http://stackoverflow.com/questions/1085097/why-cant-i-unbox-an-int-as-a-decimal ) – 2012-08-16 08:03:42
@sweetfa:虽然我指出的问题涉及int与decimal而不是枚举,但它解释了行为(与装箱和拆箱有关)。具体而言,接受的答案是指Eric Lippert撰写的一篇文章:“[Representation and Identity](http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx )“,这很详细地解释了这一点。 – 2012-08-16 08:05:08