C# 枚举运算符

C# 枚举运算符,c#,enums,operators,ternary-operator,C#,Enums,Operators,Ternary Operator,只是出于好奇,问这个 就像下面的表达 a = (condition) ? x : y; // two outputs 为什么我们不能有一个枚举运算符 说 而不是switch语句(即使重构是可能的) 还是某种无用的算子?< /P> < P> C?借用C++的语法,C++从C中借用语法,C没有一个< > >?::/Cuth>运算符,因为K&R可能不觉得有必要。它不是一个“无用的操作符”,但它会被认为是语法上的糖 此外,运算符依赖枚举声明中常量的特定顺序不是一个好主意。条件的计算结果为true或

只是出于好奇,问这个

就像下面的表达

a = (condition) ? x : y; // two outputs
为什么我们不能有一个枚举运算符

而不是switch语句(即使重构是可能的)



还是某种无用的算子?< /P> < P> C?借用C++的语法,C++从C中借用语法,C没有一个< > >?::/Cuth>运算符,因为K&R可能不觉得有必要。它不是一个“无用的操作符”,但它会被认为是语法上的糖


此外,运算符依赖枚举声明中常量的特定顺序不是一个好主意。

条件的计算结果为true或false。您不存在的运算符的建议算法是什么?很难说它是否有用,但switch case可以满足您的需要。

我不能说我曾经想要过这样一个运算符——依赖于枚举值的顺序,它会非常脆弱。您可以轻松使用开关:

switch (f)
{
    case Fruit.Apple: myValue = fnApple(); break;
    case Fruit.Mango: myValue = fnMango(); break;
    case Fruit.Orange: myValue = fnOrange(); break;
    default: throw new ArgumentOutOfRangeException("f");
}
或者,创建地图:

static readonly Dictionary<Fruit, Func<Foo>> FruitFunctions = 
    new Dictionary<Fruit, Func<Foo>> {
    { Fruit.Apple, fnApple },
    { Fruit.Mango, fnMango },
    { Fruit.Orange, fnOrange }
};
...

myValue = FruitFunctions[f]();
静态只读字典函数=
新词典{
{水果,苹果,苹果},
{水果,芒果,芒果},
{水果,橘子,橘子}
};
...
myValue=子函数[f]();

我在各种情况下都使用了这两种技术,恐怕我更喜欢它们而不是建议的操作员。

我可以马上想到三个原因:

  • 它很脆。如果有人决定对枚举进行重新排序,那么最终将调用错误的函数
  • 这是不明显的。如果不切换到枚举定义并检查枚举的顺序,我无法理解在哪种情况下哪个函数将运行
  • 像这样的东西不太可能证明规范、构建、文档和测试它所需的努力是合理的,尤其是与其他特性相比,尤其是当语言中已经有一个非常可行的替代方案时

  • 主要的问题——除了它不安全、不必要,而且在大多数实际情况下可能无法阅读之外——是它促进了一种编程模型,而现在大多数人都认为这种编程模型不好

    大多数语言都有自己允许的和想要推广的编程/设计风格。C#允许命令式和过程式编程,但促进了面向对象技术的使用。您的操作符属于第一阵营,而不是语言设计者想要支持的东西

    如果您确实希望以这种方式编程,则可以使用:

        myValue = (f == Fruit.apple) ? fnApple() 
                : (f == Fruit.mango) ? fnMango()
                : fnOrange();
    

    C和C++没有操作符本身不是一个好的原因——它们既没有lambda表达式也没有空凝聚算子。还有其他更好的理由,比如你最后一句话中的理由。更重要的是,没有什么好的理由让我这么做。我不明白你的第一个问题。你能换个说法吗?为什么我们不能依赖他们的订单呢?@Veer你可以稍后添加一个,然后你就必须更改你使用该软件的所有位置???操作人员对于地图,您只需要在一个地方修改它。@Veer:两点-首先,顺序在使用点不可见,因此很难阅读。其次,枚举声明中看似无辜的更改将完全改变代码的含义。@Veer:我会说,当一个运算符脆弱或缺乏可读性的辩护是“你不会经常使用它”时,这就说明了一切;)@Veer:当一个运算符如此脆弱时,C#team不将其包含在语言中,这无疑是一个标志。附加值不高。相反,还有一种射自己脚的方法。我认为这除了混淆之外没有什么意义。(基于布尔表达式选择结果似乎很多,但对于枚举则不是。)
    static readonly Dictionary<Fruit, Func<Foo>> FruitFunctions = 
        new Dictionary<Fruit, Func<Foo>> {
        { Fruit.Apple, fnApple },
        { Fruit.Mango, fnMango },
        { Fruit.Orange, fnOrange }
    };
    ...
    
    myValue = FruitFunctions[f]();
    
        myValue = (f == Fruit.apple) ? fnApple() 
                : (f == Fruit.mango) ? fnMango()
                : fnOrange();