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

率直に言って、私は次の 3 つの理由を考えることができます。

  1. もろいです。誰かが列挙型を並べ替えることにした場合、間違った関数が呼び出されることになります。
  2. それは自明ではありません。列挙型の定義に切り替えて、列挙型の順序を確認しないと、どの関数がどの場合に実行されるのか理解できません。
  3. すべての機能はマイナス 100 ポイントから始まります。このようなものは、特に 他の機能と比較した場合、特に言語に既に非常に実行可能な代替手段がある場合、仕様、ビルド、文書化、およびテストに必要な労力を正当化することはほとんどありません.
于 2010-03-17T07:32:38.353 に答える
2

C# は C++ から構文を借用し、C++ は C から構文を借用します。C には???:::演算子がありませんでした。K&R はおそらく演算子が必要だとは感じていなかったからです。これは「役に立たない演算子」ではありませんが、シンタックス シュガーと見なされます。

さらに、演算子が enum 宣言の定数の特定の順序に依存するのは得策ではありません。

于 2010-03-17T07:29:04.313 に答える
0

主な問題は、安全ではなく、不必要であり、ほとんどの場合、おそらく読めないことを除けば、ほとんどの人が最近悪いと見なすプログラミングモデルを促進することです。

ほとんどの言語には、許可するプログラミング/デザインスタイルと宣伝したいスタイルがあります。C#は、命令型および手続き型プログラミングを可能にしますが、オブジェクト指向技術の使用を促進します。あなたのオペレーターは最初の陣営にしっかりと属しており、言語の設計者がサポートしたいと思うようなものではありません。

そのスタイルでプログラムしたい場合は、次を使用できます。

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

条件は true または false に評価されます。存在しないオペレーターの提案されたアルゴリズムは何ですか? 役に立つかどうかはわかりませんが、switch-case は必要なことを実行できます。

于 2010-03-17T07:30:29.937 に答える