2010-03-02 7 views
7

Je n'arrive pas à trouver ce dont j'ai besoin sur google, et je parie que je vais obtenir une réponse rapide ici.Erreur de compilation en utilisant l'opérateur conditionnel C#

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

    Console.Out.WriteLine(str); 

cela? : la syntaxe me semble correcte. Je reçois erreur de compilateur cependant.

Program.cs (13,28):
erreur CS1002:; attendu
Program.cs (13,28):
erreur CS1525: terme d'expression non valide ':'
Program.cs (13,30):
erreur CS1002:;

Vous ne savez pas à propos de la syntaxe csharp, mais cela se construit dans cpp. S'il vous plaît aider! Merci! Environ 10 d'entre vous donnent la bonne réponse LOL, donc je vais juste attribuer à la première personne qui l'a soumis.

syntaxe intéressante, et je pense que je l'aime vraiment mieux que la syntaxe C++.

Le code réel que je faisais cela pour est:

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

D'autres ont déjà donné la bonne solution; il est possible que l'ordre de préséance soit le problème. 'b? (str = "true"): (str = "false"); 'Même si cela fonctionne, je ne l'utiliserais pas comme ça. – Matthew

+0

@cchampion: "syntaxe intéressante, et je pense que je l'aime vraiment mieux que la syntaxe C++." - La syntaxe C++ est la même. Cela devrait être str = b? "true": "false" dans les deux langues. – Josh

Répondre

15

Votre code devrait lire:

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

Cependant, cela se apparente à appeler juste b.ToString().ToLower(). Cela dit, je soupçonne que votre cas d'utilisation réel est un peu plus complexe que de simplement convertir la valeur booléenne en une chaîne.

Mise à jour
Comme indiqué dans les commentaires, le conditional operator retourne une valeur; ce n'est pas pour le flux de contrôle comme if/else.

+8

Le point pertinent est que l'opérateur ternaire (? :) est une expression qui renvoie une valeur, pas un mécanisme de flux de contrôle (comme si/else). –

+0

@Tyler: Bien dit. – Josh

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

Mais vous pouvez simplement faire ceci:

str = b.ToString(); 

Ou même couper les intermédiaires tout à fait:

Console.WriteLine(b); 
+0

Strictement parlant, vous obtiendriez "True" et "False" de ToString() (et donc WriteLine), pas "true" et "false", mais je ne suis pas sûr que cela m'importerait. Vous pouvez toujours faire ToString(). ToLower(). – tvanfosson

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

Mais ... Pourquoi joindre 'b' entre parenthèses? Je ne vois pas l'ambiguïté qu'il résout. –

4

L'opérateur ternaire ne permet pas de commutation de l'instruction, seulement la commutation de valeur. Vous voulez faire ceci:

str= b ? "true" : "false" 

(évidemment b.ToString()) est une meilleure solution pour ce problème particulier , mais je suppose que c'est juste un exemple).

+0

expression selection ... et str = "true" EST une expression. Essayez un = b? (str = "true"): (str = "false"); et je pense que vous trouverez que cela fonctionne très bien. –

+0

Et pour répondre au fait que c'est un code C++ valide, c'est parce que vous pouvez utiliser des instructions pour obtenir des valeurs en C++. Donc ce qui suit serait valide en C++ (bien que très confus): 'a = b? c = d: c = f' – Josh

+0

@Ben: Oui, la sélection d'expression est un meilleur terme, et une affectation est une expression (retournant la valeur placée dans la lvalue), mais la sortie de l'opérateur ternaire ne peut pas être ignorée. –

0

L'opérateur ternaire ne peut pas être le plus haut niveau d'une déclaration en C#, parce que C# exige que les expressions de haut niveau ont un effet secondaire.

-1

Juste par curiosité, pourquoi ne pas faire ceci:

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

Dans .NET, les types de valeurs convertissent automatiquement leur valeur à une chaîne quand .toString() est appelée ... y compris booléens.

+0

alors que c'est une bonne suggestion, il ne répond pas à la question de savoir pourquoi l'opérateur ternaire ne fonctionne pas dans ce cas. – Josh

+0

Le but était d'éliminer complètement le problème. D'autres réponses ont correctement expliqué pourquoi cela ne fonctionnait pas (parce qu'il ne l'utilisait pas correctement). Je n'aime pas répéter les réponses, surtout quand il y en a plusieurs. Je ne pense pas que cela méritait un vote négatif, car c'était une solution valable au problème, même s'il ne répondait pas explicitement à sa question. – jrista