簡體   English   中英

為什么枚舉需要顯式轉換為int類型?

[英]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 ++)的語言中,我們的ColorsTextures都可以被視為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.STANDINGmonsterObject.animator.State = Monster.DROOLING ,隱含地就調用類而言。

此外,是的,有一個合理的原因,我必須將枚舉值視為數字。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM