0

只是出于好奇,问这个

就像下面的表达式一样

a = (condition) ? x : y; // two outputs

为什么我们不能有一个枚举运算符?
说,

myValue = f ??? fnApple() : fnMango() : fnOrange(); // no. of outputs specified in the enum definition

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


enum Fruit
{
    apple,
    mango,
    orange      
};

Fruit f = Fruit.apple;

还是某种无用的运算符?

4

5 回答 5

17

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

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]();

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

于 2010-03-17T07:31:01.463 回答
4

顺便说一句,我可以想到三个原因:

  1. 它很脆。如果有人决定重新排序枚举,那么您最终会调用错误的函数。
  2. 这是不明显的。如果不切换到枚举定义并检查枚举的顺序,我无法理解在哪种情况下将运行哪个函数。
  3. 每个功能都以负 100 分开始。 这样的事情不太可能证明规范、构建、记录和测试它所需的努力是合理的,尤其是与其他功能相比时,尤其是当语言中已经存在高度可行的替代方案时。
于 2010-03-17T07:32:38.353 回答
2

C#借用了C++的语法,C++借用了C的语法,而C没有???:::运算符,因为K&R可能觉得没必要。它不是一个“无用的运算符”,但它会被视为语法糖。

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

于 2010-03-17T07:29:04.313 回答
0

条件被评估为真或假。您不存在的运算符的建议算法是什么?很难说它是否有用,但 switch-case 可以做你需要的。

于 2010-03-17T07:30:29.937 回答
0

主要问题——除了它在大多数实际情况下不安全、不必要和可能不可读之外——是它促进了一种现在大多数人认为不好的编程模型。

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

如果您确实想以这种风格进行编程,那么您可以使用:

    myValue = (f == Fruit.apple) ? fnApple() 
            : (f == Fruit.mango) ? fnMango()
            : fnOrange();
于 2010-03-17T07:55:50.203 回答