该特定代码片段有几个不同的问题,其中一些问题比其他问题更容易处理。其中一些只是表明您缺乏经验:
enum
并且Enum
不可互换;一个是类名,一个是 C# 关键字。在某些情况下(比如string
and 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.");
}
}