[英]Why enums require an explicit cast to int type?
這樣做沒有數據丟失,那么為什么必須明確地將枚舉轉換為整數?
如果它是隱含的,那么它是不是更直觀,比如當你有更高級別的方法時:
PerformOperation ( OperationType.Silent type )
其中PerformOperation
調用一個被PerformOperation
的包裝C ++方法:
_unmanaged_perform_operation ( int operation_type )
枚舉有兩種主要和不一致的用法:
enum Medals
{ Gold, Silver, Bronze }
[Flags]
enum FilePermissionFlags
{
CanRead = 0x01,
CanWrite = 0x02,
CanDelete = 0x04
}
在第一種情況下,將這些東西視為數字是沒有意義的。 它們作為整數存儲的事實是一個實現細節。 您無法在邏輯上添加,減去,乘以或除以金,銀和銅。
在第二種情況下,將這些東西視為數字也沒有意義。 您不能對它們進行加,減,乘或除。 唯一合理的操作是按位操作。
枚舉是糟糕的數字,所以你不應該意外地將它們視為數字。
因為枚舉不必是基於int
的:
enum關鍵字用於聲明枚舉,這是一種由稱為枚舉器列表的命名常量組成的不同類型。 每個枚舉類型都有一個基礎類型,除了char之外,它可以是任何整數類型。
所以你可以這樣做:
enum Something :long { valueX = 0, valueY = 2147483648L }
為什么你說沒有數據丟失? 畢竟,並非所有的枚舉都是整體的。 它們必須是整數類型的,但這可能意味着字節,ulong等。
作為一個角落,文字0 是隱含的,但是; 那你的用例是什么?
我很少需要這樣做 - 通常是數據導入等。偶爾的無操作演員對我來說很有意義,並避免意外錯誤。
如果它是隱含的,那么它是不是更直觀,比如當你有更高級別的方法時:
我其實不這么認為。 在這種情況下,您嘗試在邊緣情況下使用Enum。
但是,如果枚舉被隱式轉換為整數值,這將大大降低其有效性。 通過強制顯式轉換int,編譯器將枚舉視為一種特殊類型 - 許多選項之一,而不是整數。 這更清楚地演示了枚舉的意圖,並減少了程序員錯誤的可能性(即:將枚舉中未定義的值分配給枚舉變量等)。
我個人很高興C#中的枚舉超過(有效)一個常量int值。
我認為“為什么枚舉需要顯式轉換為int類型?”的答案。 根據C#,強類型枚舉是對常見編程錯誤的有用防御。
想象一下,我有一個基於兩個枚舉的繪畫管理應用程序:
enum Textures { Gloss, Satin, Matt };
enum Colors { White, Green, Red, Blue, Brown };
還有像這樣的房間繪畫方法:
private void PaintRoom (Textures texture, Colors color)
在像C#這樣具有強枚舉類型的語言中,這樣的命令:
// nonsensical attempt to have texture=White and color=Matt
PaintRoom(Colors.White, Textures.Matt);
...會產生編譯時錯誤(不能將顏色放到預期紋理的位置,反之亦然)。 但是在枚舉不是強類型和/或隱式轉換(包括C和C ++)的語言中,我們的Colors
和Textures
都可以被視為int
,所以我們可以愉快地發布PaintRoom(Colors.White, Textures.Matt)
命令它會很好地編譯,但我們最終會得到一個房間塗上光澤紅(0,2),而不是我們想要的Matt White(2,0),快速瀏覽的代碼似乎在說。
因此強烈打擊的枚舉大多是一件好事,可以阻止人們不小心將枚舉放入他們不適合的地方。 哪里有人真的希望自己的枚舉為int
,C#迫使編碼器,以使他們的意圖明顯通過堅持一個明確的轉換。
這就是C#的工作方式......
如果Enum繼承自int,那么這應該是可能的。 枚舉不從int繼承,因此需要強制轉換。
隱式轉換類的唯一方法是它們是否繼承。
正如其他人所說,不可能將所需的EnumType
轉換從EnumType
更改為int
。 但是,有幾種解決方法。 例如,我有幾個枚舉引用類似的東西,並希望能夠將它們中的任何一個分配給變量。 所以我去了:
public ValueType State {
get {
return state;
}
set {
state = (int)value;
}
}
因此,我可以說playerObject.animator.State = Player.STANDING
和monsterObject.animator.State = Monster.DROOLING
,隱含地就調用類而言。
此外,是的,有一個合理的原因,我必須將枚舉值視為數字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.