?: operátor – a ternáris feltételes operátor

A feltételes operátor ?:( más néven ternáris feltételes operátor) kiértékel egy logikai kifejezést, és a két kifejezés egyikének eredményét adja vissza attól függően, hogy a logikai kifejezés kiértékeli-e true vagy falseazt, ahogyan az alábbi példa mutatja:

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

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

Ahogy az előző példa is mutatja, a feltételes operátor szintaxisa a következő:

condition ? consequent : alternative

A condition kifejezésnek ki kell értékelnie a következőt: true vagy false. Ha condition kiértékeli a truekifejezést, a consequent rendszer kiértékeli a kifejezést, és az eredmény a művelet eredménye lesz. Ha condition kiértékeli a falsekifejezést, a alternative rendszer kiértékeli a kifejezést, és az eredmény a művelet eredménye lesz. Csak consequent vagy alternative kiértékelve. A feltételes kifejezések cél típusúak. Vagyis ha egy feltételes kifejezés céltípusa ismert, a céltípusnak consequentalternative implicit módon konvertálhatónak kell lennie a céltípusra, ahogyan az alábbi példa is mutatja:

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

Ha egy feltételes kifejezés céltípusa ismeretlen (például a kulcsszó használatakor var ) vagy a típusának consequent , és alternative azonosnak kell lennie, vagy implicit konverziónak kell lennie az egyik típusról a másikra:

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

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

A feltételes operátor jobb asszociatív, vagyis az űrlap kifejezése

a ? b : c ? d : e

kiértékelése a következőképpen történik:

a ? b : (c ? d : e)

Tipp.

A feltételes operátor kiértékelésének módját a következő mnemonikus eszköz használatával jegyezheti fel:

is this condition true ? yes : no

Feltételes újraf kifejezés

A feltételes újraf kifejezés feltételesen egy változóhivatkozást ad vissza, ahogy az alábbi példa is mutatja:

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

Hozzárendelheti egy feltételes ref-kifejezés eredményét, használhatja hivatkozási visszatérésként, vagy átadhatjarefazt , out, , invagy ref readonlymetódusparaméterként.ref A feltételes újraf kifejezés eredményéhez is hozzárendelhető, ahogy az előző példa is mutatja.

A feltételes újraf kifejezés szintaxisa a következő:

condition ? ref consequent : ref alternative

A feltételes operátorhoz hasonlóan a feltételes ref kifejezés is csak az egyiket értékeli ki a két kifejezés közül: vagy alternative.consequent

A feltételes újraf kifejezésben a típusnak meg kell egyeznie, és alternative meg kell egyeznieconsequent. A feltételes újraf kifejezések nem cél típusúak.

Feltételes operátor és utasítás if

A feltételes operátor utasítás helyett if való használata tömörebb kódot eredményezhet abban az esetben, ha feltételesen ki kell számítania egy értéket. Az alábbi példa két módszert mutat be egy egész szám negatív vagy nem nemegatív besorolására:

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

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

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

Operátorok túlterhelése

A felhasználó által definiált típus nem terhelheti túl a feltételes operátort.

C# nyelvspecifikáció

További információ: A C# nyelvi specifikációjának feltételes operátor szakasza.

Az újabb funkciók specifikációi a következők:

Lásd még