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

use*_*235 3 c# generics methods enums

我今天刚开始学习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.");
        } 
    }
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

Mic*_*eld 7

该特定代码段有几个不同的问题,其中一些比其他代码更容易处理.其中一些只是表明你缺乏经验:

  • enum并且Enum不可互换; 一个是类名,一个是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.");
  } 
}
Run Code Online (Sandbox Code Playgroud)