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

C#-språkreferensen dokumenterar den senaste versionen av C#-språket. Den innehåller även inledande dokumentation för funktioner i offentliga förhandsversioner för den kommande språkversionen.

Dokumentationen identifierar alla funktioner som först introducerades i de tre senaste versionerna av språket eller i aktuella offentliga förhandsversioner.

Dricks

Information om när en funktion först introducerades i C# finns i artikeln om språkversionshistoriken för C#.

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 villkorsstyrt referensuttryck. Använd den som referensretur eller skicka den som en refparameter för , out, ineller ref readonlymetod. 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

Om du använder den villkorsstyrda operatorn i stället för en if -instruktion kan det resultera i mer koncis kod när du behöver beräkna ett värde villkorligt. 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