簡體   English   中英

C# 枚舉和鑄造

[英]C# Enums and casting

如果在 C# 中聲明枚舉,則默認類型自動為 int。

那么,為什么在使用枚舉時的 case 語句或其他情況下,您必須顯式重鑄才能使用這些值? 如果您必須明確區分大小寫,或者我只是在這里做錯了什么,那么擁有基礎類型有什么意義?

private enum MyEnum
        {
            Value1,
            Value2,
            Value3
        }

    switch (somevalue)
                {
                    case (int)MyEnum.Value1:
                        someothervar = "ss";
                        break;
                    case (int)MyEnum.Value2:
                        someothervar = "yy";
                        break;
                    case (int)MyEnum.Value3:
                        someothervar = "gg";
                        break;
                }

somevalue 的類型是什么? 如果類型是 MyEnum,則不需要強制轉換,並且應該可以正常工作。

如果類型是 int 那么是的,您必須轉換為 MyEnum 才能正確切換 / 大小寫。 但是您可以通過強制轉換值而不是每個 case 語句來簡化這一點。 例如

switch( (MyEnum)somevalue )  {
  case MyEnum.Value1: ...
}

顯然 somevalue 是 integer 而不是明確鍵入為您的枚舉。 您應該記住,枚舉的基礎值只是“存儲類型” ,並且不能隱式互換。 但是,您可以輕松地使用 cast 運算符使您的代碼簡單且“更多”類型安全:

private enum MyEnum { Value1, Value2, Value3 }

switch ((MyEnum)somevalue)
{
    case MyEnum.Value1:
        someothervar = "ss";
        break;
    case MyEnum.Value2:
        someothervar = "yy";
        break;
    case MyEnum.Value3:
        someothervar = "gg";
        break;
    default:
        throw new NotSupportedException();
}

最終,您會想要一個不必從 integer 轉換為枚舉的設計,但在從磁盤或數據庫讀取時,通常情況並非如此。

如果somevalueMyEnum類型,則不必強制轉換為int

public enum Color
{
    Red,
    Blue,
    Green
}

class Program
{
    static void Main(string[] args)
    {
        Color color = Color.Red;

        switch (color)
        {
            case Color.Red:
                break;

            case Color.Blue:
                break;

            case Color.Green:
                break;
        }
    }
}

正如其他人所說:

  • 如果 somevalue 是 MyEnum 類型,則不必強制轉換。
  • 如果您正在從數據庫或文本文件中讀取,您可能希望使用枚舉的 Parse 方法從字符串中獲取枚舉值。
  • 如果您絕對必須比較一個 int,則將 switch 轉換為 MyEnum 比將每個 MyEnum 值轉換為一個 int 更有效。

暫無
暫無

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

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