Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用多个键为同一值打开枚举_C#_.net_Enums_Switch Statement - Fatal编程技术网

C#使用多个键为同一值打开枚举

C#使用多个键为同一值打开枚举,c#,.net,enums,switch-statement,C#,.net,Enums,Switch Statement,我已经搜索过如何在C#中切换值而不是枚举键,但是没有结果,我找到的所有帖子都说我们不需要使用值,我们可以使用键 但在我的例子中,我想使用该值,因为我进行了一个枚举,多个键共享相同的值,下面是代码: public enum PlayerPosition { North = 0, Top = 0, South = 1, Bottom = 1, East = 2, Right = 2, West = 3, Left = 3 } sw

我已经搜索过如何在C#中切换值而不是枚举键,但是没有结果,我找到的所有帖子都说我们不需要使用值,我们可以使用键

但在我的例子中,我想使用该值,因为我进行了一个枚举,多个键共享相同的值,下面是代码:

public enum PlayerPosition {
    North = 0,
    Top = 0, 
    South = 1,
    Bottom = 1,
    East = 2,
    Right = 2,
    West = 3,
    Left = 3
}


switch (obj.PlayerPosition)
{
    case PlayerPosition.North:
        // some code
        break;
    case PlayerPosition.South:
        // some code
        break;
    case PlayerPosition.East:
        // some code
        break;
    case PlayerPosition.West:
        // some code
        break;
    default:
        throw new ArgumentOutOfRangeException();
}
我认为这是工作,但我不觉得它真的可读

我想要实现的是这样的目标:

switch (obj.PlayerPosition)
{
    case PlayerPosition.Top:
    case PlayerPosition.North:
        // some code
        break;
    case PlayerPosition.Bottom:
    case PlayerPosition.South:
        // some code
        break;
    case PlayerPosition.Right:
    case PlayerPosition.East:
        // some code
        break;
    case PlayerPosition.Left:
    case PlayerPosition.West:
        // some code
        break;
    default:
        throw new ArgumentOutOfRangeException();
}
上面的示例不起作用,因为它是重复的案例标签。 我怎样才能做到这一点


编辑:在这个枚举中,北/上、南/下是完全相同的,它们只代表玩家在一张有4把椅子的桌子周围的位置。但是我们有使用北/南/东/西的旧配置文件和使用上/下/右/左的新配置文件。

如果没有两个单独的枚举,我无法理解为同一枚举值使用两个不同标签的原因。首先要回答您的问题,您可以将枚举值强制转换为int,然后对int进行比较

int value =  (int)obj.PlayerPosition
但我可能会考虑删除重复的值并使用两个枚举

public enum PlayerPosition {
    Top = 0, 
    Bottom = 1,
    Right = 2,
    Left = 3
}

public enum CompassPosition {
    North = 0, 
    South= 1,
    East= 2,
    West = 3
}
如果你想在两者之间转换,你可以直接转换,例如

PlayerPosition pos = PlayerPosition.Left;
CompassPosition compass = (CompassPosition)pos;
Console.WriteLine(compass.ToString());

不能使用枚举执行此操作。枚举的目的是使每个项具有不同的值,并且可以与其他项区分开来。为什么你会让Top和North是同一件事,而你可以一直使用North,避免另外添加Top的混淆?我个人只会有北,南,东,西,并删除其他

然而,据我所知,这应该是可行的:

public enum PlayerPosition {
    North,
    Top, 
    South,
    Bottom,
    East,
    Right,
    West,
    Left
}

switch (obj.PlayerPosition)
{
    case PlayerPosition.Top:
    case PlayerPosition.North:
        // some code
        break;
    case PlayerPosition.Bottom:
    case PlayerPosition.South:
        // some code
        break;
    case PlayerPosition.Right:
    case PlayerPosition.East:
        // some code
        break;
    case PlayerPosition.Left:
    case PlayerPosition.West:
        // some code
        break;
    default:
        throw new ArgumentOutOfRangeException();
}
我在a中对此进行了测试:仅使用新成员即可:

public enum MyEnum
{
    North  = 0, //old
    Top    = 0, //new
    South  = 1, //old
    Bottom = 1  //new
}

public static void Main()
{
    // Parse "old" from XML config (simulated)
    MyEnum test = (MyEnum)Enum.Parse(typeof(MyEnum),"North");
    //          = MyEnum.North

    switch(test)
    {
        case MyEnum.Top:
            Console.WriteLine("NORTH");
            break;
        case MyEnum.Bottom:
            Console.WriteLine("SOUTH");
            break;
        default:
            Console.WriteLine("Unsupported!");
            break;

    }
}
将输出“北”

编辑

关于你所面临的实际问题,只需说一句话:向下兼容性。
我要做的是在启动时检查配置是否与您当前的程序版本兼容。如果没有:执行“升级”功能(保存旧配置的备份,然后)将配置转换为当前版本并将其保存回磁盘

您应该修改配置文件的解析器,以便在它成为问题之前解决这个问题

您的程序一次只能有一个版本。按照现在的方式,您有两个版本的配置文件,并且您试图同时维护两个版本的代码


处理旧版本配置文件的常规方法是在读取数据时将其转换为新格式,或在首次打开时检测数据并将其在磁盘上转换为新版本(可选通知用户)。

这些别名枚举是。。。。邪恶。但在你的开关中,选择北/南或上/下。您不需要同时使用这两个枚举值,也不能同时使用这两个枚举值。如果您有不同的枚举值,则可以使用第二个版本。或者对某些枚举成员使用相同的值,然后只需使用第一个版本(并使用“主”枚举成员)。问题出在哪里?如果您确实需要同时查看这两种情况,请对第二种情况进行注释。只需使用新的枚举成员即可。它应该可以工作:(没有DV)OP在问题中解释了为什么他需要它。仅仅使用新的enum成员也可以工作。例如:从XML解析:
value=PlayerPosition.North
将输入案例
PlayerPosition.Top
。我用小提琴测试了这一点(参见我对问题的评论)@Hoots我不能用两个单独的枚举来做这件事,这里的问题是枚举将从XML文件解析,并反序列化为一个持有PlayerPosition的对象。好的,我可能仍然有两个枚举。。。除了从Xml文件中读取将发生到PlayerPosition的转换时,所有操作都使用PlayerPosition。序列化如何?如果在内部是0,是北还是顶0?我认为这个解决方案将是最难实现的,我真的不想麻烦转换,因为对我的对象的反序列化为我处理了这个问题。这是一个很好的观点,我应该测试一下它需要哪个键。吹毛求疵:这是问题的解决方案,但不是问题的解决方案。。。(虽然我同意)费尔多是对的,但这肯定是我最终要做的。读取时修改配置文件肯定是在代码中只保留一个版本的方法。@Fildor:Yep。这是通常的回答方式。@MarkBenningflied我不知道XY的问题是什么,谢谢@费尔多:是的,但我也知道用户只是因为牙痛就用DV发帖子,所以担心这一点并没有什么好处。现在,如果他们中有十个人用DV记录了这件事,那可能就是有问题了。