C# Language ? : Operatore ternario

Esempio

Restituisce uno dei due valori in base al valore di un'espressione booleana.

Sintassi:

condition ? expression_if_true : expression_if_false;

Esempio:

string name = "Frank";
Console.WriteLine(name == "Frank" ? "The name is Frank" : "The name is not Frank");

L'operatore ternario ha una associazione destra che consente di utilizzare espressioni ternarie composte. Questo viene fatto aggiungendo ulteriori equazioni ternarie nella posizione vera o falsa di un'equazione ternaria genitore. Bisogna fare attenzione per garantire la leggibilità, ma questa può essere una utile stenografia in alcune circostanze.

In questo esempio, un'operazione ternaria composta valuta una funzione di clamp e restituisce il valore corrente se è compreso nell'intervallo, il valore min se è inferiore all'intervallo o il valore max se è superiore all'intervallo.

light.intensity = Clamp(light.intensity, minLight, maxLight);

public static float Clamp(float val, float min, float max)
{
    return (val < min) ? min : (val > max) ? max : val;
}

Anche gli operatori ternari possono essere annidati, come ad esempio:

a ? b ? "a is true, b is true" : "a is true, b is false" : "a is false"

// This is evaluated from left to right and can be more easily seen with parenthesis:

a ? (b ? x : y) : z

// Where the result is x if a && b, y if a && !b, and z if !a

Quando si scrivono dichiarazioni ternarie composte, è comune utilizzare parentesi o rientranza per migliorare la leggibilità.

I tipi di expression_if_true e expression_if_false devono essere identici o deve esserci una conversione implicita da uno all'altro.

condition ? 3 : "Not three"; // Doesn't compile because `int` and `string` lack an implicit conversion.

condition ? 3.ToString() : "Not three"; // OK because both possible outputs are strings.

condition ? 3 : 3.5; // OK because there is an implicit conversion from `int` to `double`. The ternary operator will return a `double`.

condition ? 3.5 : 3; // OK because there is an implicit conversion from `int` to `double`. The ternary operator will return a `double`.

I requisiti di tipo e conversione si applicano anche alle tue classi.

public class Car
{}

public class SportsCar : Car
{}

public class SUV : Car
{}

condition ? new SportsCar() : new Car(); // OK because there is an implicit conversion from `SportsCar` to `Car`. The ternary operator will return a reference of type `Car`.

condition ? new Car() : new SportsCar(); // OK because there is an implicit conversion from `SportsCar` to `Car`. The ternary operator will return a reference of type `Car`.

condition ? new SportsCar() : new SUV(); // Doesn't compile because there is no implicit conversion from `SportsCar` to SUV or `SUV` to `SportsCar`. The compiler is not smart enough to realize that both of them have an implicit conversion to `Car`.

condition ? new SportsCar() as Car : new SUV() as Car; // OK because both expressions evaluate to a reference of type `Car`. The ternary operator will return a reference of type `Car`.