簡體   English   中英

在C#中使用通用方法中的枚舉

[英]Using enums in generic methods in C#

我今天剛開始學習C#,我正在嘗試制作一個可以在不同枚舉上運行的通用方法。 我在紙上的另一個問題中找到了一些代碼,但編譯器一直在抱怨。 我想知道是否有人可以幫助我。 這是我到目前為止:

    static void ReadMenuInput<T>(out T menuInput)
    {
        while (true)
        {
            if (enum<T>.TryParse(Console.ReadLine(), out menuInput) && menuInput < sizeof(T))
            {
                break;
            }
            Console.WriteLine("Please enter a valid input.");
        } 
    }

謝謝您的幫助!

該特定代碼段有幾個不同的問題,其中一些比其他代碼更容易處理。 其中一些只是表明你缺乏經驗:

  • enumEnum不可互換; 一個是類名,一個是C#關鍵字。 在某些情況下(例如, stringString ),關鍵字只是該類型的別名,但enum不是類型名稱,它用於定義類型名稱。 要調用類方法,您需要使用Enum
  • 您試圖使用錯誤的語法調用通用TryParse<>方法; 它應該是Enum.TryParse<T>
  • 枚舉和整數不是同一類型,您不能只比較它們。 但他們卻是,通過顯式類型轉換可轉換到另一個。 由於sizeof返回一個int ,你需要這樣的類型轉換(但見下文)。

代碼示例中更復雜的問題:

  • 我認為, sizeof(enum)沒有達到預期的效果; 它返回枚舉的大小( 以字節單位) ,通常為4.您可能需要IsDefined方法,它可以讓您知道枚舉類型中是否定義了特定的整數值
  • 正如編譯器將告訴您的那樣,您只能在此上下文中使用不可為空的泛型類型。 定義它的方法是在泛型類型上使用where T: struct約束 請注意,盡管名稱不同,但這並不會強制您的類型成為結構; 它只是強迫它成為一種價值類型。
  • 您無法在泛型類型上指定它必須是枚舉類型的約束; 如果您將其他值類型傳遞給方法,它將在運行時拋出異常。 由你來正確處理這個案子。

這是你想要的代碼片段的工作(如在 - 它編譯 - 我還沒有實際測試過)。 但是,我將指出原始代碼中的每個問題都可以通過閱讀和理解錯誤消息來解決; 這是作為C#開發人員應該擅長的最重要的技能之一。

static void ReadMenuInput<T>(out T menuInput) where T : struct
{           
  while (true)
  {
    if (Enum.TryParse<T>(Console.ReadLine(), out menuInput)
     && Enum.IsDefined(typeof(T), menuInput))
    {
      break;
    }

    Console.WriteLine("Please enter a valid input.");
  } 
}

暫無
暫無

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

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