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

C# 在C中的泛型方法中使用枚举#,c#,generics,methods,enums,C#,Generics,Methods,Enums,我今天刚开始学习C#,我正在尝试制作一种通用方法,可以对不同的枚举进行操作。我在纸上的另一个问题中找到了一些代码,但编译器一直在抱怨。我想知道是否有人能帮我一把。以下是我到目前为止的情况: static void ReadMenuInput<T>(out T menuInput) { while (true) { if (enum<T>.TryParse(Console.ReadLine(), out

我今天刚开始学习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.");
        } 
    }
static void ReadMenuInput(out T menuInput)
{
while(true)
{
if(enum.TryParse(Console.ReadLine(),out menuInput)&&menuInput

谢谢你的帮助

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

  • enum
    enum
    不可交换;一个是类名,一个是C#关键字。在某些情况下(例如,
    string
    string
    ),关键字只是类型的别名,但
    enum
    不是类型名,它用于定义类型名。要调用类方法,需要使用
    Enum
  • 您试图用错误的语法调用generic
    TryParse
    方法;它应该是
    Enum.TryParse
  • 枚举数和整数不是同一类型,您不能只对它们进行比较。然而,它们可以通过显式类型转换相互转换。由于
    sizeof
    返回一个
    int
    ,因此需要这样的类型转换(但请参见下文)
代码示例中更复杂的问题:

  • sizeof(enum)
    并没有达到您的期望,我认为;它返回枚举的大小(以字节为单位),通常为4。您可能需要该方法,该方法让您知道是否在枚举类型中定义了特定的整数值
  • 编译器将告诉您,在此上下文中只能使用不可为null的泛型类型。定义这一点的方法是在泛型类型上使用。请注意,尽管名称不同,但这并不强制您的类型成为结构;它只是强制它成为值类型
  • 您无法在泛型类型上指定必须是枚举类型的约束;如果将其他值类型传递给该方法,它将在运行时引发异常。这件事由你来妥善处理
这是您想要的代码片段的工作(如编译——我还没有实际测试)版本。但是,我要指出,您原始代码中的每一个问题都将通过阅读和理解错误消息来解决;作为一名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.");
  } 
}
static void ReadMenuInput(out T menuInput),其中T:struct
{           
while(true)
{
if(Enum.TryParse(Console.ReadLine(),out menuInput)
&&已定义枚举(类型(T),菜单输入))
{
打破
}
Console.WriteLine(“请输入有效的输入。”);
} 
}

C语言的第一天,您正在学习泛型。请将编译器的抱怨添加到您的问题中。在我使用PHP语言编写C语言的第一天,我在Java语言中仅用了几周时间就做到了这一点,非常感谢。这很管用。我想我需要几周的时间才能掌握所有错误消息的窍门。一开始它们很神秘还有一件事。。。在哪里可以找到有关“Where T:struct”构造的更多信息。我以前从未见过这种情况。它叫什么?其中T:以在泛型中添加约束而闻名。我在我的答案中添加了一个到约束文档的链接。