2013-03-11 13 views
6

Ich kann nicht verstehen, warum der obige Code (geändert von den tatsächlichen Codes) mir immer seltsames Ergebnis gibt: "ZXCV)" anstelle von "Tom (ZXCV)".Warum funktioniert der folgende Bedingungsoperator in StringBuilder, die den Nullable-Typ enthalten, merkwürdig? in C#?

Kennt jemand den Grund und kann, wenn möglich, eine Referenz zur Verfügung stellen?

+0

Können Sie ein Beispiel für die erwartete HTML und tatsächliche HTML geben Sie daraus? –

+1

Es ist auch nicht das Nullable-Element. –

+0

@TomRiley Ich erwarte '' aber es gibt mir 'ZXCV)' statt – ocean4dream

Antwort

5

Ihnen fehlen einige Klammern um Ihren Bedingungsausdruck.

Versuchen Sie stattdessen:

string text = "<option value=\"" + cuID.Value + "\">" + cuName + " (" + (cuEmpID == "" ? "-" : cuEmpID) + ")" + "</option>"; 
htmlResp.Append(text); 

Was warum die fehlenden Klammern, dass ... Das ist eine interessante Frage zu geschehen verursacht!

es zu beantworten, lassen Sie mich den ursprünglichen Code ein wenig vereinfachen:

string text = ">>>" + cuEmpID == "" ? "-" : cuEmpID + "<<<"; // Gives "ZXCV<<<" 

Was passiert ist, dass der bedingte Ausdruck ">>>" + cuEmpID == "" als Bedingung verwendet. Das ist nicht gleich "", also wird die rechte Seite des Bedingungsausdrucks verwendet, nämlich der cuEmpID + "<<<" Teil, der die Ausgabe angibt, die wir sehen.

Sie sollten wirklich den Ausdruck vereinfachen, zum Beispiel:

string normalisedEmpID = cuEmpID == "" ? "-" : cuEmpID; 

string text = string.Format 
(
    "<option value=\"{0}\">{1} ({2})</option>", 
    cuID.Value, 
    cuName, 
    normalisedEmpID 
); 
3

Ein gutes Beispiel für „nicht Ausdrücke zu komplex machen“.

"<option value=\"" + cuID.Value + "\">" + cuName 
     + " ("+cuEmpID==""? "-":cuEmpID+")"+ "</option>"); 

als

zusammengestellt
("<option value=\"" + cuID.Value + "\">" + cuName+" ("+cuEmpID) == "" 
     ? "-" 
     : cuEmpID+")"+ "</option>"); 

Ein einfaches 'fix'

"<option value=\"" + cuID.Value + "\">" + cuName + " (" 
     + ((cuEmpID == "") ? "-" : cuEmpID) 
     + ")" + "</option>" 

sein würde, aber zur besseren Lesbarkeit verwenden einige Zwischenvariablen. ?: sollte niemals in anderen Ausdrücken verschachtelt sein.