C# 枚举组合和按位运算符

C# 枚举组合和按位运算符,c#,enums,C#,Enums,我的代码中定义了以下枚举: [Flags] public enum Symbol { A, B, } public enum Production { AA = Symbol.A | Symbol.A, AB = Symbol.A | Symbol.B, BA = Symbol.B | Symbol.A, // <- this will obviously not work } 我完全理解为什么会发生这种情况,但我想知道是否有一个按位运算符的组合

我的代码中定义了以下枚举:

[Flags]
public enum Symbol
{
    A,
    B,
}

public enum Production
{
    AA = Symbol.A | Symbol.A,
    AB = Symbol.A | Symbol.B,
    BA = Symbol.B | Symbol.A, // <- this will obviously not work
}
我完全理解为什么会发生这种情况,但我想知道是否有一个按位运算符的组合,我可以使用它使其工作,因为我最初的打算


或者,一般来说,我试图以不正确的方式使用枚举,因此应该切换到
chars
或甚至是自定义结构?

好吧,因为您需要注意a和B的顺序,而不是使用一些不可交换的操作。我建议最好的方法是,每个位置都应该有指定的权重,并且可以简单地添加带有权重的符号。由于
Enum
s是
int
s,您可以为每个位置分配一个10^i的权重,其中i是从右向左看的位置的从零开始的索引。即使这样,您也可以计算更多的符号。这与经典的阿拉伯数字类似,但使用的是符号而不是常规数字。代码可以如下所示:

    [Flags]
    public enum Symbol
    {
        A,
        B,
    }

    public enum Production
    {
        AA = Symbol.A *10 + Symbol.A, //0
        AB = Symbol.A *10 + Symbol.B, //1
        BA = Symbol.B *10 + Symbol.A, //10
    }
你正在努力表演。这不是枚举的用途。像F#这样的语言有一个很好的内置机制来实现这一点,例如:

match expression with 
| pattern_1 -> expression_1 
| pattern_2 -> expression_2 
| pattern_n -> expression_n

但C#还没有这个。有一个很棒的项目,将一个库添加到C#中,为它提供这种称为的功能。我认为库是您最好的选择。

由于您希望保留有关值和位置的信息,您需要对不同位置的不同值使用不同的枚举值:

[Flags]
public enum Symbol {
  FirstA = 1,
  FirstB = 2,
  SecondA = 4,
  SecondB = 8
}

public enum Production {
  AA = Symbol.FirstA | Symbol.SecondA,
  AB = Symbol.FirstA | Symbol.SecondB,
  BA = Symbol.FirstB | Symbol.SecondA
}

老实说,我不明白您在这里想要实现什么。我希望使用枚举进行语法分析(使用一组已定义的符号)。这意味着Symbol.A和Symbol.B可用于构造已在
产品
枚举中定义的单词。但是我介绍的实现不允许构造
Production.BA
。希望能澄清一点。另一方面:用
[Flags]
修饰的枚举应该是复数。正常枚举应该是奇异的。所以,你的基本问题是X | Y和Y | X是一样的。这就是OR操作符的工作方式。回到绘图板。感谢Steve,正如我在帖子中提到的那样-我确实理解为什么会发生这种情况,我只是想知道是否有一种按位运算符的组合可以用来实现我想要的。我认为这是最接近我想要实现的,最后,我跳过了枚举的使用,因为它们在这个特定场景中运行得不好。谢谢
[Flags]
public enum Symbol {
  FirstA = 1,
  FirstB = 2,
  SecondA = 4,
  SecondB = 8
}

public enum Production {
  AA = Symbol.FirstA | Symbol.SecondA,
  AB = Symbol.FirstA | Symbol.SecondB,
  BA = Symbol.FirstB | Symbol.SecondA
}