【发布时间】:2012-08-12 13:14:50
【问题描述】:
这个问题与泛型方法中的枚举类型有关
给定一个枚举
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;
尝试执行crusty的初始化时抛出运行时异常。
谁能解释为什么会发生这种情况,以及为什么这样做是不合法的。
并不是我真的想这样做,但我在尝试用泛型实现类似的事情时遇到了一个问题,实际上这就是幕后发生的事情。即
public T dosomething<T>(short val) where T : new()
{
T result = (T)(object) val;
return result;
}
所以我想要做的是有一个通用函数,它可以与枚举和非枚举一起使用(不是那么关键,但会很好),可以将其设置为一个短值而不会引发异常并实际初始化正确的枚举值。
【问题讨论】:
-
指出青蛙和蟾蜍不是甲壳类动物会不会有点过分? :)
-
@sweetfa:虽然我指出的问题涉及 int 与 decimal 而不是枚举,但它确实解释了行为(与装箱和拆箱有关)。特别是,接受的答案是指 Eric Lippert 的一篇文章:“Representation and Identity”,其中非常详细地解释了这一点。