【问题标题】:Using enums in generic methods in C#在 C# 的泛型方法中使用枚举
【发布时间】:2012-06-10 02:57:39
【问题描述】:

我今天刚开始学习 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# 的第一天,你正在学习泛型。
  • 请将编译器的投诉添加到您的问题中。
  • 在我使用 C# 来自 PHP 的第一天,我只用了几周的 Java 就做了同样的事情

标签: c# generics methods enums


【解决方案1】:

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

  • enumEnum 不可互换;一个是类名,一个是 C# 关键字。在某些情况下(例如,stringString)关键字只是类型的别名,但 enum 不是类型名称,它用于定义类型名称。要调用类方法,您需要使用Enum
  • 您尝试使用错误的语法调用通用TryParse&lt;&gt; 方法;应该是Enum.TryParse&lt;T&gt;
  • 枚举和整数不是同一类型,不能只比较它们。但是,它们可以通过显式类型转换转换。由于sizeof 返回int,因此您需要这样的类型转换(但请参见下文)。

您的代码示例更复杂的问题:

  • 我认为sizeof(enum) 并没有达到你的预期;它返回枚举的大小以字节为单位,通常为 4。您可能需要IsDefined 方法,它可以让您知道是否在枚举类型中定义了特定的整数值
  • 编译器会告诉您,您只能在此上下文中使用不可为空的泛型类型。定义它的方法是在泛型类型上使用where T: struct constraint。请注意,尽管它的名字,这并不强制你的类型是一个结构。它只是强制它成为一个值类型。
  • 您无法在泛型类型上指定它必须是枚举类型的约束;如果您将一些其他值类型传递给该方法,它将在运行时引发异常。妥善处理此案由您自己决定。

这是您想要的代码 sn-p 的工作(如 -- 它编译 -- 我还没有实际测试过)版本。但是,我要指出的是,您的原始代码中的每一个问题都可以通过阅读和理解错误消息来解决;这是作为 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.");
  } 
}

【讨论】:

  • 非常感谢。那效果很好。我想我需要几周的时间才能了解所有错误消息。一开始它们很神秘。
  • 还有一件事...我在哪里可以找到有关“where T : struct”构造的更多信息。我以前从未见过这种情况。它叫什么?
  • 其中 T: 以在泛型中添加约束而闻名。
  • 我在答案中添加了约束文档的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多