?: – ternární podmíněný operátor

Podmíněný operátor , označovaný také jako ternární podmíněný operátor ?:, vyhodnotí logický výraz a vrátí výsledek jednoho ze dvou výrazů v závislosti na tom, jestli se logický výraz vyhodnotí jako true nebo false, jak ukazuje následující příklad:

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

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

Jak ukazuje předchozí příklad, syntaxe podmíněného operátoru je následující:

condition ? consequent : alternative

Výraz condition musí být vyhodnocen jako true nebo false. Pokud condition se vyhodnotí jako truevýraz , consequent vyhodnotí se výraz a jeho výsledek se stane výsledkem operace. Pokud condition se vyhodnotí jako falsevýraz , alternative vyhodnotí se výraz a jeho výsledek se stane výsledkem operace. Pouze consequent nebo alternative se vyhodnocuje. Podmíněné výrazy jsou typu cíle. To znamená, že pokud je znám cílový typ podmíněného výrazu, musí být typy consequent a alternative musí být implicitně konvertibilní na cílový typ, jak ukazuje následující příklad:

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 };

Pokud je cílový typ podmíněného výrazu neznámý (například při použití var klíčového consequent slova) nebo typ a alternative musí být stejný nebo musí existovat implicitní převod z jednoho typu na druhý:

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

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

Podmíněný operátor je asociativní, tedy výraz formuláře.

a ? b : c ? d : e

se vyhodnotí jako

a ? b : (c ? d : e)

Tip

Pomocí následujícího měmnického zařízení si můžete zapamatovat, jak se podmíněný operátor vyhodnotí:

is this condition true ? yes : no

Podmíněný výraz odkazu

Podmíněný odkazový výraz podmíněně vrátí odkaz na proměnnou, jak ukazuje následující příklad:

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 Můžete přiřadit výsledek podmíněného ref výrazu, použít ho jako odkaz návratu nebo předat jako ref, out, in, nebo ref readonly parametr metody. Můžete také přiřadit výsledek podmíněného ref výrazu, jak ukazuje předchozí příklad.

Syntaxe podmíněného ref výrazu je následující:

condition ? ref consequent : ref alternative

Podobně jako podmíněný operátor vyhodnocuje podmíněný výraz ref pouze jeden ze dvou výrazů: buď consequent nebo alternative.

V podmíněném ref výrazu musí být typ consequent a alternative musí být stejný. Podmíněné ref výrazy nejsou typu cíle.

Podmíněný operátor a if příkaz

Použití podmíněného operátoru místo if příkazu může vést k výstižnějšímu kódu v případech, kdy potřebujete podmíněně vypočítat hodnotu. Následující příklad ukazuje dva způsoby klasifikace celého čísla jako záporné nebo nenegativní:

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

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

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

Přetížení operátoru

Uživatelem definovaný typ nemůže přetížit podmíněný operátor.

specifikace jazyka C#

Další informace naleznete v části Podmíněný operátor specifikace jazyka C#.

Specifikace pro novější funkce jsou:

Viz také