[英]Why do we need to type cast an enum in C#
我有一個像:
public enum Test:int
{
A=1,
B=2
}
所以在這里我知道我的枚舉是一個int類型,但如果我想做類似下面的事情:
int a = Test.A;
這不起作用。
如果我有一個類:
public class MyTest
{
public static int A =1;
}
我可以說 ,
int a = MyTest.A;
這里我不需要顯式地將A
為int。
所以在這里我知道我的枚舉是一個int類型
不,這不對。 它有一個基礎類型的int
,但它是一個單獨的類型。 哎呀,這首先是枚舉的一半 - 你可以將這些類型分開。
如果你想在枚舉值和它的數字等價物之間進行轉換,那么你就可以進行轉換 - 這並不是那么痛苦,它可以使你的代碼在類型安全方面更加清晰。 基本上,它是其中一件事,其中正確的事情是罕見的,使它適當地使其明確。
編輯:一個怪胎,你應該知道的是,有從定值0到枚舉類型的隱式轉換:
Test foo = 0;
實際上,在MS實現中,它可以是任何類型的常量0:
Test surprise = 0.0;
這是一個錯誤,但是修復它已經太晚了:)
我相信這個隱式轉換的其余部分是為了更簡單地檢查是否在標志枚舉中設置了任何位,以及使用“0值”的其他比較。 就個人而言,我不是那個決定的粉絲,但值得至少知道它。
枚舉值不是int
類型。 int
是枚舉的基本類型。 枚舉在技術上是整數,但邏輯上(從C#語言的角度來看)不是。 默認情況下, int
( System.Int32
)是所有枚舉的基本類型,如果您沒有明確指定另一個枚舉。
使用您更新的示例:
public class MyTest
{
public static int A =1;
}
用法:
int a = MyTest.A;
這不是枚舉的樣子。 枚舉看起來更像(評論是我們與真實枚舉不同的地方):
public struct MyTest /* Of course, this isn't correct, because we'll inherit from System.ValueType. An enum should inherit from System.Enum */
{
private int _value; /* Should be marked to be treated specially */
private MyTest(int value) /* Doesn't need to exist, since there's some CLR fiddling */
{
_value = value;
}
public static explicit operator int(MyTest value) /* CLR provides conversions automatically */
{
return value._value;
}
public static explicit operator MyTest(int value) /* CLR provides conversions automatically */
{
return new MyTest(value);
}
public static readonly MyTest A = new MyTest(1); /* Should be const, not readonly, but we can't do a const of a custom type in C#. Also, is magically implicitly converted without calling a constructor */
public static readonly MyTest B = new MyTest(2); /* Ditto */
}
是的,您可以輕松地獲取“基礎”int值,但A
和B
的值仍然強類型為MyTest
類型。 這可以確保你不小心在他們沒有適當的地方使用它們。
你的枚舉屬於Test
類型。 這不是int
,因為你有枚舉整數值而已。
您可以強制轉換枚舉以獲取int值:
int a = (int) Test.A;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.