簡體   English   中英

我可以將int轉換為C#枚舉類型嗎?

[英]Can I cast an int into a C# enum type?

我有一個帶有兩個值的枚舉(基礎類型為int ),以及一個帶有該類型參數的方法。 是否可以將任何int值轉換為我的枚舉類型並將其傳遞給方法? 如果是這樣,枚舉的優點是什么? 是不是應該限制可用值的選擇?

class Program
{
    public void Greeting(MyCode code)
    {
        Console.WriteLine(code);
    }

    static void Main(string[] args)
    {
        var p = new Program();
        var m = new MyCode();

        m = (MyCode) 3;
        p.Greeting(m);
    }
}

public enum MyCode:int
{
   Hello =1,
   Hai
}

是的,您可以轉換基礎類型的任何值。 在這種意義上,枚舉類型不是限制類型。

使用枚舉的優點是:

  • 可讀性
  • 明確投射時的正確性
  • 能夠通過反射等方式訪問價值觀

我同意更多類型也是有用的,但它在C#中不存在。 您可以在C#中構建自己的基於類的“偽枚舉”,它允許一組受限制的值(使用私有構造函數),但是:

  • 你不能讓它們不可空
  • 你無法打開它們
  • 您不能將它們用於常量值(例如可選參數默認值)
  • 該值始終是引用,這可能會影響內存使用(例如,與具有基礎類型字節的枚舉相比)
  • 面對序列化保留受限制的值很有意思

另一方面,這些類型可以多態地行動並且具有比普通枚舉更多的信息,這可以是有用的。

只是為了補充Jon的答案:你可以隨時使用

Enum.IsDefined(typeof(MyCode), value)

檢查枚舉定義中是否存在提供的值。

在許多方面,Enums在.NET語言中被實現為語法糖 報價,

enum關鍵字用於聲明枚舉,這是一種由稱為枚舉器列表的命名常量組成的不同類型。

換句話說,枚舉的值是與任何其他字段一樣的字段,而不是值的整數選擇。 沒有什么可以阻止您將無效值轉換為枚舉。 你可以做的最大的努力來確保枚舉的有效內容是使用Enum.IsDefined靜態方法(盡管你可能想要定義擴展方法,如果這需要你的想象)。

然而,枚舉的目的不是驗證用戶輸入,因此它們不必像那樣嚴格。 枚舉的目的是將名稱綁定到數值,並輕松顯示此類可能組合的列表。 並且不要忘記他們的松散結構允許像Day.Saturday | Day.Friday一樣的東西 Day.Saturday | Day.Friday或更復雜的聯軸器。 它們仍然非常有用。

暫無
暫無

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

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