use*_*235 3 c# generics methods enums
我今天刚开始学习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.");
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助!
该特定代码段有几个不同的问题,其中一些比其他代码更容易处理.其中一些只是表明你缺乏经验:
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.");
}
}
Run Code Online (Sandbox Code Playgroud)