3

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

感谢您的帮助!

4

1 回答 1

7

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

  • enum并且Enum不可互换;一个是类名,一个是 C# 关键字。在某些情况下(比如stringand String),关键字只是类型的别名,而enum不是类型名称,它用于定义类型名称。要调用类方法,您需要使用Enum.
  • 您正在尝试TryParse<>使用错误的语法调用泛型方法;它应该是Enum.TryParse<T>
  • 枚举和整数不是同一类型,不能只比较它们。但是,它们可以通过显式类型转换相互转换由于sizeof返回 an 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.");
  } 
}
于 2012-06-10T03:20:43.423 回答