?:演算子 (C# リファレンス)?: Operator (C# Reference)

条件演算子 ?: は、一般に三項条件演算子と呼ばれ、ブール式を評価し、ブール式の評価結果 (true または false) に応じて、2 つの式のいずれかの評価結果を返します。The conditional operator ?:, commonly known as the ternary conditional operator, evaluates a Boolean expression, and returns the result of evaluating one of two expressions, depending on whether the Boolean expression evaluates to true or false. C# 7.2 以降、ref 条件式は、2 つの式のいずれかの結果への参照を返します。Beginning with C# 7.2, the conditional ref expression returns the reference to the result of one of the two expressions.

この条件演算子の構文は次のとおりです。The syntax for the conditional operator is as follows:

condition ? consequent : alternative

condition 式は true または false と評価する必要があります。The condition expression must evaluate to true or false. conditiontrue と評価された場合は、consequent 式が評価され、その結果が演算の結果になります。If condition evaluates to true, the consequent expression is evaluated, and its result becomes the result of the operation. conditionfalse と評価された場合は、alternative 式が評価され、その結果が演算の結果になります。If condition evaluates to false, the alternative expression is evaluated, and its result becomes the result of the operation. consequent または alternative のみが評価されます。Only consequent or alternative is evaluated.

consequent の型と alternative の型は同じ型であるか、一方の型から他方の型への暗黙の型変換が存在している必要があります。The type of consequent and alternative must be the same, or there must be an implicit conversion from one type to the other.

条件演算子は右結合です。つまり、次の形式の式があるとします。The conditional operator is right-associative, that is, an expression of the form

a ? b : c ? d : e

これが次のように評価されます。is evaluated as

a ? b : (c ? d : e)

この演算子の評価方法を簡単に思い出すには、次のように質問します。A handy mnemonic device you can use to remember how this operator evaluates is by asking:

is this condition true ? yes : no

演算子の ? の部分はwith the ? 前の文章の疑問符に対応し、結果はこの質問に対する論理的な答えに対応します。part of the operator acting as a question mark for the previous statement, and the consequent acting as the logical response to this question.

条件演算子の使用例を次に示します。The following example demonstrates the usage of the conditional operator:

double sinc(double x) => x != 0.0 ? Math.Sin(x) / x : 1;

Console.WriteLine(sinc(0.1));
Console.WriteLine(sinc(0.0));
// Output:
// 0.998334166468282
// 1

ref 条件式Conditional ref expression

C# 7.2 以降、ref 条件式を使用して、2 つの式のいずれかの結果に対する参照を返すことができます。Beginning with C# 7.2, you can use the conditional ref expression to return the reference to the result of one of the two expressions. この参照を ref ローカルまたは ref readonly ローカル変数に代入できます。または、参照の戻り値または ref メソッドのパラメーターとして使用できます。You can assign that reference to a ref local or ref readonly local variable, or use it as a reference return value or as a ref method parameter.

ref 条件式の構文は次のとおりです。The syntax for the conditional ref expression is as follows:

condition ? ref consequent : ref alternative

元の条件演算子と同じように、ref 条件式は、2 つの式 (consequent または alternative) のいずれかのみを評価します。Like the original conditional operator, the conditional ref expression evaluates only one of the two expressions: either consequent or alternative.

ref 条件式の場合、consequentalternative の型は同じである必要があります。In the case of the conditional ref expression, the type of consequent and alternative must be the same.

ref 条件演算子の使用例を次に示します。The following example demonstrates the usage of the conditional ref expression:

var smallArray = new int[] { 1, 2, 3, 4, 5 };
var largeArray = new int[] { 10, 20, 30, 40, 50 };

int index = 7;
ref int refValue = ref ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]);
refValue = 0;

index = 2;
((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]) = 100;

Console.WriteLine(string.Join(" ", smallArray));
Console.WriteLine(string.Join(" ", largeArray));
// Output:
// 1 2 100 4 5
// 10 20 0 40 50

詳細については、機能提案メモを参照してください。For more information, see the feature proposal note.

条件演算子と if..else ステートメントConditional operator and an if..else statement

条件演算子を if-else ステートメントで使用すると、値の計算を条件付きで実行する必要がある場合に、コードをもっと簡潔にできる可能性があります。Use of the conditional operator over an if-else statement might result in more concise code in cases when you need conditionally to compute a value. 次の例では、整数を負の値または負以外の値に分類するための 2 つの方法を示しています。The following example demonstrates two ways to classify an integer as negative or nonnegative:

int input = new Random().Next(-5, 5);

string classify;
if (input >= 0)
{
    classify = "nonnegative";
}
else
{
    classify = "negative";
}

classify = (input >= 0) ? "nonnegative" : "negative";

演算子のオーバーロード可/不可Operator overloadability

条件演算子は、オーバーロードできません。The conditional operator cannot be overloaded.

C# 言語仕様C# language specification

詳細については、「C# 言語仕様」の「条件演算子」セクションを参照してください。For more information, see the Conditional operator section of the C# language specification.

関連項目See also