2010-11-29 12 views
3

Ich bin ratlos. Warum sollten die erste und die vierte Zeile nicht null sein?Bedingter Ausdruck in Convert.ToString() Bewertung falsch?

null wut

Post-Antwort bearbeiten:

boolFoo ? null : Convert.ToString(DBNull.Value) 

Das funktioniert, weil Convert.ToString() und null ein bedeuten:

Zum Wohle der anderen, würde das gewünschte Verhalten durch die Verwendung erstellt werden üblicher Typ von string.

Antwort

3

Aus Dokumentation MSDN für die ?: operator:

Entweder ist die Art von first_expression und second_expression müssen gleich sein, oder eine implizite Konvertierung von einem Typ zum anderen existieren.

In diesem Fall sieht es aus wie null implizit zu System.Object umgewandelt wird. Von einem kleinen Graben weiter in MSDN in der Dokumentation, Convert.ToString(Object value) kehrt String.Empty wenn valuenull ist.

Dies ist nicht das gleiche wie in der sechsten Zeile in Ihrem Beitrag, wie Convert.ToString(null) tut nicht implizit null zu System.Object konvertieren (da Sie nicht den ?: Operator verwenden).

+0

Nicht in der sechsten Zeile, wo Convert.ToString (null) als null und nicht String.Empty ausgewertet wird. [Missachtet dies; Sie wurde geschrieben, bevor Sie Ihren Kommentar geändert haben.] – bblack

0

Sie sind null, es ist nur ihr Typ, der DBNull ist.

+0

Ihre Art ist DBNull nicht; Es ist eine Zeichenfolge. – bblack

2

Es sieht aus wie sie null bewerten, aber Convert.ToString(object) kehrt null Werte als String.Empty.

bearbeiten pro Kommentar des OP

Im Falle Convert.ToString(string), wird die Zeichenfolge einfach zurückgegeben, auch wenn null. Mit freundlicher Genehmigung von Reflector:

public static string ToString(string value) 
{ 
    return value; 
} 
+0

Nicht in der sechsten Zeile, in der Convert.ToString (null) als null und nicht als String.Empty ausgewertet wird. – bblack

+0

@fearpi - Guter Punkt. Ich habe den Beitrag aktualisiert. –

1

Convert.ToString((DBNull)null) ruft die Convert.ToString(object) Überlastung, die returns an empty string, wenn es eine Null übergeben wird. Aus diesem Grund werden die ersten und vierten Zeilen zu einer leeren Zeichenfolge ausgewertet.

Convert.ToString(null) ruft die Convert.ToString(string) Überladung auf, da dies die am weitesten abgeleitete anwendbare Version ist. Diese Überlastung returns the argument unchanged. Aus diesem Grund wird die sechste Zeile zu null ausgewertet.