?: – 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 true
výraz , consequent
vyhodnotí se výraz a jeho výsledek se stane výsledkem operace. Pokud condition
se vyhodnotí jako false
vý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: