다음을 통해 공유


?: 연산자 - 3개로 구성된 조건 연산자

다음 예제와 같이, 3개로 구성된 조건 연산자라고도 하는 조건 연산자 ?:은 부울 식을 계산하고 부울 식이 true 또는 false로 계산되는지에 따라 두 식 중 하나의 결과를 반환합니다.

string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";

Console.WriteLine(GetWeatherDisplay(15));  // output: Cold.
Console.WriteLine(GetWeatherDisplay(27));  // output: Perfect!

위의 예제에서 볼 수 있듯이 조건 연산자의 구문은 다음과 같습니다.

condition ? consequent : alternative

condition 식은 true 또는 false로 계산되어야 합니다. conditiontrue로 계산되면 consequent 식이 계산되고 해당 결과가 연산 결과가 됩니다. conditionfalse로 계산되면 alternative 식이 계산되고 해당 결과가 연산 결과가 됩니다. consequent 또는 alternative만 계산됩니다. 조건식은 대상 형식입니다. 즉, 조건식의 대상 유형을 알고 있는 경우 consequentalternative의 형식은 다음 예제와 같이 대상 유형으로 암시적으로 변환 가능해야 합니다.

var rand = new Random();
var condition = rand.NextDouble() > 0.5;

int? x = condition ? 12 : null;

IEnumerable<int> xs = x is null ? new List<int>() { 0, 1 } : new int[] { 2, 3 };

조건식의 대상 유형을 모르는 경우(예: var 키워드 사용) 또는 consequentalternative의 형식이 같아야 하거나 한 형식에서 다른 형식으로 암시적인 변환이 있어야 합니다.

var rand = new Random();
var condition = rand.NextDouble() > 0.5;

var x = condition ? 12 : (int?)null;

조건부 연산자는 오른쪽 결합성입니다. 즉, 다음 형식의 식을 가정해 보세요.

a ? b : c ? d : e

이 식은 다음과 같이 계산됩니다.

a ? b : (c ? d : e)

다음과 같은 니모닉 디바이스를 사용하여 조건부 연산자의 평가 방식을 기억할 수 있습니다.

is this condition true ? yes : no

조건부 ref 식

조건부 참조 식은 다음 예와 같이 조건부로 변수 참조를 반환합니다.

int[] smallArray = {1, 2, 3, 4, 5};
int[] largeArray = {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

조건부 참조 식의 결과를 ref할당하거나, 이를 참조 반환으로 사용하거나 ref, out, in 또는 ref readonly 메서드 매개변수로 전달합니다. 앞의 예와 같이 조건부 참조 식의 결과에 할당할 수도 있습니다.

조건부 ref 식의 구문은 다음과 같습니다.

condition ? ref consequent : ref alternative

조건 연산자와 마찬가지로 조건 참조 식은 두 식 중 하나만 평가합니다(consequent 또는 alternative).

조건부 참조 식에서 consequentalternative의 형식은 동일해야 합니다. 조건부 참조 식은 대상 형식이 아닙니다.

조건부 연산자 및 if

if 대신 조건부 연산자를 사용하면 조건부로 값을 컴퓨팅해야 하는 경우 코드가 보다 간결해질 수 있습니다. 다음 예제에서는 정수를 음수 또는 음수가 아닌 값으로 분류하는 두 가지 방법을 보여 줍니다.

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

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

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

연산자 오버로드 가능성

사용자 정의 형식은 조건부 연산자를 오버로드할 수 없습니다.

C# 언어 사양

자세한 내용은 C# 언어 사양조건부 연산자 섹션을 참조하세요.

최신 기능에 대한 사양은 다음과 같습니다.

참고 항목