web-dev-qa-db-ja.com

? else-partのない演算子

C#を使用していますか? 1つの行に影響するifステートメントがあり、それがすべて問題ない場合の演算子。しかし、私がこのコードを持っているとしましょう(古典的なifステートメントを使用):

if(someStatement)
{
    someBool = true;  //someBools value is unknown
}
else
{
    //Do nothing
}

これは、次のようにすることでワンライナーで実現できます。

someBool = (someStatement) ? true : someBool;

しかし、なぜ私はこのようなことをすることができないのですか?

someBool = (someStatement) ? true : ;
//or possibly
someBool = (someStatement) ? true;

これは何らかの方法で可能ですか?もしそうなら、他の方法よりもある方法を使用する利点はありますか?そうでない場合は、なぜそれができないのですか?

22

できるよ:

someBool = (someStatement) ? true : someBool;

私はそれがあなたに多くの明快さを得るとは思わない:

if (someStatement)
{
    someBool = true;
}

しかし、それは本当に好みの問題のようです。どちらも明らかに悪いとは言えませんが、前者は一般的ではないので、おそらくそれは避けます。


次のように演算子を使用できない理由を尋ねます。

someBool = (someStatement) ? true : ;

これは非常に大きな言語の変更になります!割り当ては次のようになることに注意してください。

<location> = <expression>;

式はいくつかの値を与えるために評価され、その値は場所に格納されます。 (場所が変数、プロパティ、フィールド、またはインデックス式であるかどうかによって、「保存」操作はまったく異なる場合があります。)

ここでは、通常の値に加えて、右側の式の値を「変更なし」の値にすることができます。これは、割り当てステートメントで使用すると、ストアが発生しないという特別な動作があります。発生する操作。これは他の通常の値とは異なり、驚くべきことです。しかし、それを他の場所で使用するとどういう意味ですか?

// Does this call DoSomething when cond is false?
// If so, what value is passed to it?
someObject.DoSomething(cond?x:);

// What happens here if cond is false? Does it cancel
// the entire assignment?
int x = 77 + (cond?2:) * 3 - 4;

// If cond is false, are methods F1 and F2 called or not called?
int x = F1() + (cond?2:) + F2();

// What does this do? Does it skip the return if cond is false?
return (cond?2:);

これらすべての状況で、オペレーターにとって賢明で直感的で一貫した動作を思い付くのは非常に難しいと思いますが、単純な割り当て以外では役に立たないと思います。それは他の言語と合わないだけです-それを含めると、言語の学習、読み取り、理解、実装、説明が難しくなります。それはほんの少しの簡潔さのためにそれだけの価値はありません。

21
Weeble

基本的に、条件付き演算子を、それ用に設計されていないものに使用しようとしています。

オプションで何らかのアクションを実行する ...を意味するのではなく、ある式を評価することを意味し、それが式の結果になります。

なんらかの条件が満たされた場合にのみアクションを実行したい場合は、ifステートメントを使用します。これがまさにそのためです。

あなたの例では、あなたはcouldを使用します:

// Renamed someStatement to someCondition for clarity
someBool |= someCondition;

または

someBool = someCondition ? true : someBool;

...言い換えると、「someConditionがtrueでない限り、既存の値を使用します...しかし、個人的には、元のifステートメントがより明確であると思います。

17
Jon Skeet

背景:このような構成をよく使用します。

sql = "SELECT x FROM table WHERE Y " + (condition ? " AND Column = 1" : "");

Razorビューでもこのような構成を使用します

<div class='someclass @(condition ? "anotherclass" : "")'></div>

: ""はかなり煩わしいので、拡張メソッドを作成しました

public static T Then<T>(this bool value, T result)
{
    return value ? result : default(T);
}

使用法:

<div class='someclass @condition.Then("anotherclass")'></div>

ここから取得した

2
Alex