在 C# 中的泛型方法中使用枚举

本文关键字:枚举 泛型方法 | 更新日期: 2023-09-27 18:36:45

我今天刚开始学习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.");
        } 
    }

感谢您的帮助!

在 C# 中的泛型方法中使用枚举

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

  • 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.");
  } 
}