?: operator - de ternaire voorwaardelijke operator

De voorwaardelijke operator, ook wel bekend als de ternaire voorwaardelijke operator ?:, evalueert een Booleaanse expressie en retourneert het resultaat van een van de twee expressies, afhankelijk van of de Boole-expressie resulteert in true of false, zoals in het volgende voorbeeld wordt weergegeven:

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

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

Zoals in het voorgaande voorbeeld wordt weergegeven, is de syntaxis voor de voorwaardelijke operator als volgt:

condition ? consequent : alternative

De condition expressie moet worden geëvalueerd of falsetrue . Als condition dit wordt truegeëvalueerd, wordt de consequent expressie geëvalueerd en wordt het resultaat ervan het resultaat van de bewerking. Als condition dit wordt falsegeëvalueerd, wordt de alternative expressie geëvalueerd en wordt het resultaat ervan het resultaat van de bewerking. Alleen consequent of alternative wordt geëvalueerd. Voorwaardelijke expressies zijn doelgetypeerd. Als een doeltype van een voorwaardelijke expressie bekend is, moeten de typen consequent en alternative impliciet worden geconverteerd naar het doeltype, zoals in het volgende voorbeeld wordt weergegeven:

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

Als een doeltype van een voorwaardelijke expressie onbekend is (bijvoorbeeld wanneer u het var trefwoord gebruikt) of het type consequent en alternative hetzelfde moet zijn of als er een impliciete conversie van het ene type naar het andere moet zijn:

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

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

De voorwaardelijke operator is rechts-associatief, dat wil gezegd een expressie van het formulier

a ? b : c ? d : e

wordt geëvalueerd als

a ? b : (c ? d : e)

Tip

U kunt het volgende mnemonic-apparaat gebruiken om te onthouden hoe de voorwaardelijke operator wordt geëvalueerd:

is this condition true ? yes : no

Expressie voor voorwaardelijke verw

Een expressie voor voorwaardelijke verw retourneert voorwaardelijk een variabeleverwijzing, zoals in het volgende voorbeeld wordt weergegeven:

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

U kunt het resultaat van een expressie voor voorwaardelijke verw toewijzen, deze gebruiken als verwijzingsresource of doorgeven als een ref, outof ref readonlyinmethodeparameter.ref U kunt ook toewijzen aan het resultaat van een voorwaardelijke verw-expressie, zoals in het voorgaande voorbeeld wordt weergegeven.

De syntaxis voor een expressie voor voorwaardelijke verw is als volgt:

condition ? ref consequent : ref alternative

Net als bij de voorwaardelijke operator evalueert een expressie voor voorwaardelijke verw slechts één van de twee expressies: ofwel consequentalternative.

In een voorwaardelijke verw-expressie moet het type consequent en alternative hetzelfde zijn. Expressies voor voorwaardelijke verw zijn niet doelgetypeerd.

Voorwaardelijke operator en een if instructie

Het gebruik van de voorwaardelijke operator in plaats van een if instructie kan leiden tot beknoptere code in gevallen waarin u voorwaardelijk een waarde wilt berekenen. In het volgende voorbeeld ziet u twee manieren om een geheel getal als negatief of niet-negatief te classificeren:

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

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

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

Overbelasting van operatoren

Een door de gebruiker gedefinieerd type kan de voorwaardelijke operator niet overbelasten.

C#-taalspecificatie

Zie de sectie Voorwaardelijke operator van de C#-taalspecificatie voor meer informatie.

Specificaties voor nieuwere functies zijn:

Zie ook