枚举的运算符

Ams*_*nna 0 c# enums operators ternary-operator

只是出于好奇,问这个

就像下面的表达一样

a = (condition) ? x : y; // two outputs
Run Code Online (Sandbox Code Playgroud)

为什么我们不能为枚举操作?
说,

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

而不是switch语句(即使可以进行重构)


enum Fruit
{
    apple,
    mango,
    orange      
};

Fruit f = Fruit.apple;
Run Code Online (Sandbox Code Playgroud)

或者它是某种无用的运营商?

Jon*_*eet 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");
}
Run Code Online (Sandbox Code Playgroud)

或者,创建一个地图:

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

myValue = FruitFunctions[f]();
Run Code Online (Sandbox Code Playgroud)

我已经在各种情况下使用了这两种技术,而且我更害怕它们与建议的运算符相比.

  • 为什么我们不能依赖他们的订单呢? (2认同)
  • @Veer:两点 - 首先,订单在使用时不可见,因此难以阅读.其次,枚举声明中看似无辜的变化将完全改变代码的含义. (2认同)
  • @Veer:我会说,当一个操作员的防守很脆弱或缺乏可读性时,"你经常不会经常使用它"然后说这一切;) (2认同)