2010-03-02 18 views
7

Non riesco a trovare quello che mi serve su google e scommetto che otterrò una risposta rapida qui.Errore del compilatore usando l'operatore condizionale C#

String str; 
    bool b = true; 
    b ? str="true" : str="false"; 

    Console.Out.WriteLine(str); 

che? : la sintassi sembra corretta per me. Sto ricevendo errore del compilatore però.

Program.cs (13,28):
errore CS1002:; atteso
Program.cs (13,28):
errore CS1525: termine Espressione non valida ':'
Program.cs (13,30):
errore CS1002:; atteso

Non sono sicuro della sintassi csharp, ma si basa su cpp. Per favore aiuto! Grazie!

AGGIORNAMENTO: Circa 10 di voi danno la risposta corretta LOL, quindi assegnerò solo alla prima persona che l'ha presentata.

Sintassi interessante, e penso che in realtà mi piace meglio della sintassi C++.

Il codice vero che stavo facendo questo per è:

ftp.ConnectMode = job.FTPUsePassiveMode ? FTPConnectMode.PASV : FTPConnectMode.ACTIVE; 
+0

Altri hanno già fornito la soluzione adeguata; è possibile che l'ordine di precedenza sia il problema. 'b? (str = "true"): (str = "false"); 'Anche se funziona, non lo userei in questo modo. – Matthew

+0

@cchampion: "Sintassi interessante, e penso che mi piaccia davvero meglio della sintassi C++." - La sintassi C++ è la stessa. Dovrebbe essere str = b? "true": "false" in entrambe le lingue. – Josh

risposta

15

Il codice dovrebbe leggere:

str = b ? "true" : "false"; 

Tuttavia, questo è solo simile a chiamare b.ToString().ToLower(). Detto questo, ho il sospetto che il tuo caso d'uso reale sia un po 'più complesso della semplice conversione del valore booleano in una stringa.

Aggiornamento
Come indicato nei commenti, il conditional operator restituisce un valore; non è per il flusso di controllo come if/else.

+8

Il punto rilevante è che l'operatore ternario (? :) è un'espressione che restituisce un valore, non un meccanismo di controllo del flusso (come se fosse/else). –

+0

@Tyler: Ben detto. – Josh

15
str = b ? "true" : "false"; 

Ma si può solo fare questo:

str = b.ToString(); 

O anche tagliare fuori gli intermediari del tutto:

Console.WriteLine(b); 
+0

A rigor di termini, otterresti "True" e "False" da ToString() (e quindi da WriteLine), non "vero" e "falso", ma non sono sicuro che mi importi. È sempre possibile eseguire ToString(). ToLower(). – tvanfosson

1
str = (b) ? "true" : "false"; 
+0

Ma ... Perché racchiudere 'b' tra parentesi? Non riesco a vedere l'ambiguità che risolve. –

4

L'operatore ternario non consente per la commutazione dichiarazione, solo commutazione del valore. Si vuole fare questo:

str= b ? "true" : "false" 

(ovviamente b.ToString()) è una soluzione migliore per questo particolare problema, ma io sto assumendo questo è solo un esempio).

+0

expression selection ... and str = "true" È un'espressione. Prova a = b? (str = "true"): (str = "false"); e penso che troverai che funziona bene. –

+0

E per dire che questo è un codice C++ valido, è perché puoi usare le istruzioni per ottenere valori in C++. Quindi il seguente sarebbe valido in C++ (anche se molto confuso): 'a = b? c = d: c = f' – Josh

+0

@ Ben: Sì, la selezione delle espressioni è un termine migliore e un assegnamento è un'espressione (restituendo il valore inserito nel lvalue), ma l'output dell'operatore ternario non può essere ignorato. –

0

L'operatore ternario non può essere il livello superiore di una dichiarazione in C#, C#, perché richiede che le espressioni di alto livello hanno un effetto collaterale.

-1

Solo per curiosità, perché non basta fare questo:

bool b = true; 
string str = b.ToString(); 

In .NET, i tipi di valore convertono automaticamente il loro valore in una stringa quando .ToString() si chiama ... compreso booleani.

+0

mentre quello è un buon suggerimento non risponde alla domanda sul perché l'operatore ternario non sta lavorando in questo caso. – Josh

+0

Il punto era eliminare completamente il problema. Altre risposte spiegavano adeguatamente perché non stava funzionando (perché lo stava usando in modo errato). Non mi piace ripetere le risposte, specialmente quando ce ne sono molte. Non penso che questo meritasse un voto negativo, poiché era una soluzione valida al problema, anche se non rispondeva esplicitamente alla sua domanda. – jrista

Problemi correlati