?: 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 true
consequent
utvärderas uttrycket och resultatet blir resultatet av åtgärden. Om condition
utvärderas till false
alternative
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
, in
eller 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: