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