這個問題涉及到枚舉的鑄造泛型方法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