C#使用foreach遍历Enum配合switch case出现类型隐式转换错误
错误原因
- 你调用
Enum.GetNames(typeof(typeOfDevice))返回的是枚举项对应的字符串名称数组,比如"iphone"、"android"这类字符串,所以foreach循环中遍历的used变量是string类型 - 你在case分支中使用的是枚举类型本身的实例,和string类型不匹配,所以触发了类型隐式转换的报错
- 额外的命名问题:你代码里把枚举类型名和存储枚举名称的数组变量搞混了,
usedDevice是你定义的数组变量,不能用usedDevice.iphone调用枚举项,应该用枚举类型名typeOfDevice.iphone
解决方案
方案1:保持遍历字符串,修改case匹配内容
直接把case后面的内容改成对应枚举项的字符串即可,这里用nameof关键字获取枚举项的字符串名称,比硬编码字符串更稳妥,后续修改枚举项名时编译器会自动提示报错:
enum typeOfDevice { iphone=99, android=59, tablet=49 } // 重命名变量避免和枚举类型混淆 var usedDeviceNames = Enum.GetNames(typeof(typeOfDevice)); foreach (string used in usedDeviceNames) { switch (used) { case nameof(typeOfDevice.iphone): Console.Write($"enter how many time you used Iphone"); var inputIphone = Console.ReadLine(); break; case nameof(typeOfDevice.android): Console.Write($"enter how many time you used Android"); var inputAndroid = Console.ReadLine(); break; case nameof(typeOfDevice.tablet): Console.Write($"enter how many time you used Tablet"); var inputTablet = Console.ReadLine(); break; default: break; } }
方案2:直接遍历枚举值(更推荐)
不需要转字符串,直接遍历枚举类型的所有值,类型匹配更不容易出错:
enum typeOfDevice { iphone=99, android=59, tablet=49 } // 直接获取枚举值集合并转换为对应枚举类型 var usedDevices = Enum.GetValues(typeof(typeOfDevice)).Cast<typeOfDevice>(); foreach (typeOfDevice used in usedDevices) { switch (used) { case typeOfDevice.iphone: Console.Write($"enter how many time you used Iphone"); var inputIphone = Console.ReadLine(); break; case typeOfDevice.android: Console.Write($"enter how many time you used Android"); var inputAndroid = Console.ReadLine(); break; case typeOfDevice.tablet: Console.Write($"enter how many time you used Tablet"); var inputTablet = Console.ReadLine(); break; default: break; } }
注意:同作用域下不能重复定义同名变量input,所以上述代码对不同场景的输入变量做了命名区分,你也可以提前定义一个公共变量复用
内容的提问来源于stack exchange,提问作者Nixit Ahir
相关产品推荐
相关产品推荐

