[英]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.");
}
}
謝謝您的幫助!
該特定代碼段有幾個不同的問題,其中一些比其他代碼更容易處理。 其中一些只是表明你缺乏經驗:
enum
和Enum
不可互換; 一個是類名,一個是C#關鍵字。 在某些情況下(例如, string
和String
),關鍵字只是該類型的別名,但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.