Como usar o operador ternário dentro de uma string interpolada?

408

Estou confuso sobre o motivo pelo qual esse código não será compilado:

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

Se eu dividir, funciona bem:

var desc = isDescending ? " desc" : string.Empty;
var result = $"{fieldName}{desc}";
Nate Barbettini
fonte
9
@Sinatr Link atualizado: thebillwagner.com/Blog/Item/…
Nate Barbettini 6/15
O mesmo se aplica ao qualificador de alias de espaço para nome (: :) .
Uwe Keim
Discussão relacionada à equipe de Roslyn: Erro de sintaxe estranho na cadeia de caracteres interpolada ao usar?:
mins

Respostas:

722

De acordo com a documentação :

A estrutura de uma cadeia de caracteres interpolada é a seguinte:

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

O problema é que os dois pontos são usados ​​para denotar formatação, como:

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

A solução é agrupar o condicional entre parênteses:

var result = $"Descending {(isDescending ? "yes" : "no")}";
Nate Barbettini
fonte
2
Ainda mais interessante exemplo é um presente quando você precisa usar uma seqüência de interpolação aninhada: Console.WriteLine($"Cargo Weight: {(ship.WeightAvailable ? $"{ship.Weight:0.00}" : "n/a")}");
Jan