以下代碼不會產生異常,而是將值4傳遞給tst。任何人都可以解釋這背後的原因嗎?將超出範圍的數字投射到C#中的枚舉不會產生異常
public enum testing
{
a = 1,
b = 2,
c = 3
}
testing tst = (testing)(4);
以下代碼不會產生異常,而是將值4傳遞給tst。任何人都可以解釋這背後的原因嗎?將超出範圍的數字投射到C#中的枚舉不會產生異常
public enum testing
{
a = 1,
b = 2,
c = 3
}
testing tst = (testing)(4);
在C#中,與Java不同,枚舉不被檢查。您可以具有任何基礎類型的值。這就是爲什麼檢查你的輸入非常重要。
if(!Enum.IsDefined(typeof(MyEnum), value))
throw new ArgumentOutOfRangeException();
由於您的枚舉基於int,因此它可以接受int可以接受的任何值。而且,由於你明確地告訴編譯器(通過強制轉換)可以將4強制轉換爲枚舉值,因此它可以這麼做。
每個枚舉都有一個基礎數值類型(例如int),用於表示。即使一個值沒有名字,這也是枚舉可能的值。
其他人沒有說的:通過投射,你告訴編譯器你知道你在做什麼。所以如果你告訴它,把它看作一個枚舉值,它就是這樣。其他海報指出爲什麼這仍然是允許的,因爲即使你說你知道你在做什麼,C#編譯器也不允許有太多壞事。
如果該值不被允許,那將是非常糟糕的,因爲那樣你不能將標誌值保存爲int。或者,有人必須檢查int是否是允許的組合之一,如果使用標誌枚舉(可以或者可以組合在一起),這可能會很多。
我渴望作爲Java開發人員(LINQ!)的C#的一些特性,但是在這裏Java確實沒錯...... – 2009-03-06 10:35:02