You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:15:02