只是出于好奇,询问这个

想表达一下

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

我们为什么不可以有一个运营商枚举?
说的,

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

代替换声明(尽管重组可能的)


enum Fruit
{
    apple,
    mango,
    orange      
};

Fruit f = Fruit.apple;

或者是某种无用的操作者?

有帮助吗?

解决方案

我不能说我曾经想这样的运营商 - 这将是依靠枚举值的排序令人难以置信的脆弱。可以方便地用一个开关:

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

我已经用在各种情况下这两种技术,并远他们宁愿建议的操作,我害怕。

其他提示

随便我能想到的三个原因:

  1. 它的脆弱。如果有人决定重新排序的枚举,然后你就会结束了错误的功能。
  2. 这是非显而易见的。我不能理解其功能将在其中运行的情况下不切换到enum的定义并检查其以枚举。
  3. 每一个特开始的减去100分。 像这样的东西是不可能的辩护所需的努力规格、建造、文件和测试,特别是相对于其他特征, 尤其是特别 当有一个高度可行的替代办法已经在语言。

C#从C ++借用的语法,和C ++借用的语法从C,和C不具有???:::操作者,因为K&R可能不喜欢它是必要的。这不是一个“没用的经营者”,但它会被认为是语法糖。

此外,它不是一个运营商依靠常量在枚举声明中的特定顺序是一个好主意。

条件被评估为真或假。什么是你的建议不存在操作的算法?这是很难说是否可能是有用与否,但开关的情况下可以做你所需要的。

主要的问题 - 除了它是不安全的,不必要的,而且可能无法读取在大多数实际案例 - 是它促进了编程模型,大多数人会这几天关于坏

大多数语言都有规划/设计风格,他们允许那些他们想推广。 C#允许必要的和程序性节目,但提倡使用面向对象的技术。您的运营商牢牢属于第一阵营,是不是该语言的设计者希望支持。

如果你确实想在风格编程,那么你可以使用:

    myValue = (f == Fruit.apple) ? fnApple() 
            : (f == Fruit.mango) ? fnMango()
            : fnOrange();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top