?: – operátor (Referenční dokumentace jazyka C#)

Podmíněný operátor ?: , označovaný také jako Ternární podmíněný operátor, vyhodnocuje logický výraz a vrátí výsledek jednoho ze dvou výrazů, v závislosti na tom, zda je logický výraz vyhodnocen true false jako nebo, 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 pro podmíněný operátor je následující:

condition ? consequent : alternative

conditionVýraz musí být vyhodnocen jako true nebo false . Pokud se condition vyhodnotí jako true , consequent vyhodnotí se výraz a jeho výsledek se projeví v důsledku operace. Pokud se condition vyhodnotí jako false , alternative vyhodnotí se výraz a jeho výsledek se projeví v důsledku operace. consequent alternative Je vyhodnocena pouze nebo.

Počínaje jazykem C# 9,0 jsou podmíněné výrazy typu Target-Type. To znamená, že pokud je znám cílový typ podmíněného výrazu, typy consequent a alternative musí být implicitně převoditelné 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 cílový typ podmíněného výrazu je neznámý (například při použití var klíčového slova) nebo v jazyce C# 8,0 a starší, typ consequent a alternative musí být stejný nebo musí být 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í zprava, to znamená výraz formuláře.

a ? b : c ? d : e

je vyhodnocen jako

a ? b : (c ? d : e)

Tip

K zapamatování, jak podmíněný operátor je vyhodnoceno, můžete použít následující symbolické zařízení:

is this condition true ? yes : no

Podmíněný výraz ref

Počínaje jazykem C# 7,2 je místní proměnná ref nebo ref pouze pro místní proměnné, kterou lze přiřadit podmíněnému výrazu ref. Podmíněný výraz ref můžete použít také jako návratovou hodnotu odkazu nebo jako ref argument metody.

Syntaxe pro podmíněný výraz ref je následující:

condition ? ref consequent : ref alternative

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

V případě podmíněného referenčního výrazu consequent alternative musí být typ a. Podmíněné referenční výrazy nejsou typu Target-Type.

Následující příklad ukazuje použití podmíněného referenčního výrazu:

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

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

Použití podmíněného operátoru namísto if příkazu může mít za následek výstižnější kód v případech, kdy budete potřebovat podmíněně k výpočtu hodnoty. Následující příklad ukazuje dva způsoby, jak klasifikovat celé číslo jako záporné nebo nezáporné:

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živatelsky 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#.

Další informace o funkcích přidaných v C# 7,2 a novějších verzích najdete v následujících poznámkách k návrhu funkcí:

Viz také