Operatore ?: - Operatore condizionale ternario
L'operatore condizionale ?:
, anche noto come operatore condizionale ternario, valuta un'espressione booleana e restituisce il risultato di una delle due espressioni, a seconda che l'espressione booleana restituisca true
o false
, come illustrato nell'esempio seguente:
string GetWeatherDisplay(double tempInCelsius) => tempInCelsius < 20.0 ? "Cold." : "Perfect!";
Console.WriteLine(GetWeatherDisplay(15)); // output: Cold.
Console.WriteLine(GetWeatherDisplay(27)); // output: Perfect!
Come illustrato nell'esempio precedente, la sintassi dell'operatore condizionale è la seguente:
condition ? consequent : alternative
L'espressione condition
deve restituire true
o false
. Se condition
restituisce true
, viene valutata l'espressione consequent
e il suo risultato diventa il risultato dell'operazione. Se condition
restituisce false
, viene valutata l'espressione alternative
e il suo risultato diventa il risultato dell'operazione. Viene valutata solo consequent
o solo alternative
. Le espressioni condizionali sono espressioni con tipo di destinazione. Ovvero, se è noto un tipo di destinazione di un'espressione condizionale, i tipi di consequent
e alternative
devono essere convertibili in modo implicito nel tipo di destinazione, come illustrato nell'esempio seguente:
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 };
Se un tipo di destinazione di un'espressione condizionale è sconosciuto (ad esempio, quando si usa la parola chiave var
) o il tipo di consequent
e alternative
deve essere uguale o deve essere eseguita una conversione implicita da un tipo all'altro:
var rand = new Random();
var condition = rand.NextDouble() > 0.5;
var x = condition ? 12 : (int?)null;
L'operatore condizionale si associa all'operando a destra, che significa che un'espressione nel formato
a ? b : c ? d : e
viene valutata come
a ? b : (c ? d : e)
Suggerimento
Un modo per ricordarsi che cosa restituisce questo operatore è il seguente:
is this condition true ? yes : no
Espressione condizionale ref
Un'espressione condizionale ref restituisce in modo condizionale un riferimento a una variabile, come illustrato nell'esempio seguente:
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
È possibile assegnare ref
al risultato di un'espressione condizionale ref, usarlo come valore restituito di riferimento o passarlo come parametro del metodo ref
, out
, in
o ref readonly
. È anche possibile assegnarlo al risultato di un'espressione condizionale ref, come illustrato nell'esempio precedente.
La sintassi di un'espressione condizionale ref è la seguente:
condition ? ref consequent : ref alternative
Come l'operatore condizionale, un'espressione condizionale ref valuta solo una delle due espressioni: consequent
o alternative
.
In un'espressione condizionale ref, il tipo di consequent
e alternative
deve essere lo stesso. Le espressioni condizionali ref non sono espressioni con tipo di destinazione.
Operatore condizionale e istruzione if
L'uso dell'operatore condizionale invece di un'istruzione if
potrebbe generare codice più conciso nel casi in cui occorre calcolare un valore in modo condizionale. L'esempio seguente illustra due modi di classificare un intero come negativo o non negativo:
int input = new Random().Next(-5, 5);
string classify;
if (input >= 0)
{
classify = "nonnegative";
}
else
{
classify = "negative";
}
classify = (input >= 0) ? "nonnegative" : "negative";
Overload degli operatori
Un tipo definito dall'utente può eseguire l'overload dell'operatore condizionale.
Specifiche del linguaggio C#
Per altre informazioni, vedere la sezione Operatore condizionale della specifica del linguaggio C#.
Le specifiche per le funzionalità più recenti sono: