Dela via


?: operator – den villkorsstyrda operatorn ternary

Villkorsoperatorn ?:, även kallad villkorsoperatorn ternary, utvärderar ett booleskt uttryck och returnerar resultatet av ett av de två uttrycken, beroende på om det booleska uttrycket utvärderas till true eller false, som följande exempel visar:

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

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

Som föregående exempel visar är syntaxen för den villkorsstyrda operatorn följande:

condition ? consequent : alternative

Uttrycket condition måste utvärderas till true eller false. Om condition utvärderas till trueconsequent utvärderas uttrycket och resultatet blir resultatet av åtgärden. Om condition utvärderas till falsealternative utvärderas uttrycket och resultatet blir resultatet av åtgärden. Endast consequent eller alternative utvärderas. Villkorsuttryck är måltypade. Det vill säga om en måltyp för ett villkorsuttryck är känd, måste typerna av consequent och alternative implicit konverteras till måltypen, som följande exempel visar:

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

Om en måltyp för ett villkorsuttryck är okänd (till exempel när du använder nyckelordet var ) eller typen av consequent och alternative måste vara samma eller om det måste finnas en implicit konvertering från en typ till en annan:

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

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

Den villkorsstyrda operatorn är höger associativ, det vill

a ? b : c ? d : e

utvärderas som

a ? b : (c ? d : e)

Dricks

Du kan använda följande mnemonic-enhet för att komma ihåg hur den villkorsstyrda operatorn utvärderas:

is this condition true ? yes : no

Villkorsstyrd referensuttryck

Ett villkorsstyrt referensuttryck returnerar villkorligt en variabelreferens, vilket visas i följande exempel:

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

Du kan ref tilldela resultatet av ett villkorsstyrd referensuttryck, använda det som en referensretur eller skicka det som parametern ref, out, ineller ref readonly metod. Du kan också tilldela resultatet av ett villkorsstyrt ref-uttryck, vilket visas i föregående exempel.

Syntaxen för ett villkorsstyrd referensuttryck är följande:

condition ? ref consequent : ref alternative

Precis som villkorsoperatorn utvärderar ett villkorsstyrt ref-uttryck bara ett av de två uttrycken: antingen consequent eller alternative.

I ett villkorsstyrt ref-uttryck måste typen av consequent och alternative vara densamma. Villkorsstyrda ref-uttryck är inte måltypade.

Villkorsstyrd operator och en if instruktion

Användning av villkorsoperatorn i stället för en if instruktion kan resultera i mer koncis kod i de fall du behöver villkorligt för att beräkna ett värde. I följande exempel visas två sätt att klassificera ett heltal som negativt eller icke-negativt:

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

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

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

Överlagring av operator

En användardefinierad typ kan inte överbelasta den villkorsstyrda operatorn.

Språkspecifikation för C#

Mer information finns i avsnittet Villkorsstyrd operator i C#-språkspecifikationen.

Specifikationer för nyare funktioner är:

Se även