¿Cómo usar el operador ternario dentro de una cadena interpolada?

408

Estoy confundido sobre por qué este código no se compilará:

var result = $"{fieldName}{isDescending ? " desc" : string.Empty}";

Si lo divido, funciona bien:

var desc = isDescending ? " desc" : string.Empty;
var result = $"{fieldName}{desc}";
Nate Barbettini
fuente
99
@Sinatr Enlace actualizado: thebillwagner.com/Blog/Item/…
Nate Barbettini
Lo mismo se aplica al calificador de alias de espacio de nombres (: :) .
Uwe Keim
Discusión relacionada con el equipo de Roslyn: extraño error de sintaxis en una cadena interpolada cuando se usa?:
minutos

Respuestas:

722

De acuerdo con la documentación :

La estructura de una cadena interpolada es la siguiente:

{ <interpolationExpression>[,<alignment>][:<formatString>] }

El problema es que los dos puntos se usan para denotar el formato, como:

Console.WriteLine($"The current hour is {hours:hh}")

La solución es envolver el condicional entre paréntesis:

var result = $"Descending {(isDescending ? "yes" : "no")}";
Nate Barbettini
fuente
2
Aún más interesante ejemplo es éste cuando se necesita usar una cadena de interpolación anidada: Console.WriteLine($"Cargo Weight: {(ship.WeightAvailable ? $"{ship.Weight:0.00}" : "n/a")}");
Ene