Convert.ToString(null)
kehrt zurück
null
Wie ich erwartet habe.
Aber
Convert.ToString(null as object)
kehrt zurück
""
Warum sind diese unterschiedlich?
Hier kommen 2 Überladungen ToString
ins Spiel
Convert.ToString(object o);
Convert.ToString(string s);
Der C # -Compiler versucht im Wesentlichen, die spezifischste Überladung auszuwählen, die mit der Eingabe funktioniert. Ein null
Wert kann in einen beliebigen Referenztyp konvertiert werden. In diesem Fall string
ist es spezifischer als object
und daher wird es als Gewinner ausgewählt.
In der haben null as object
Sie den Typ des Ausdrucks als verfestigt object
. Dies bedeutet, dass es nicht mehr mit der string
Überladung kompatibel ist und der Compiler die object
Überladung auswählt, da es die einzige verbleibende kompatible ist.
Die wirklich haarigen Details, wie dieses Binden funktioniert, werden in Abschnitt 7.4.3 der C # -Sprachenspezifikation behandelt.
Convert.ToString(string)
es sich nur um eine Identitätsfunktion, während SieConvert.ToString(object)
tatsächlich einen schwer zu verfolgenden Pfad durchlaufen. Auf einen Blick würde ich zustimmen, dass sie dasselbe zurückgeben sollten, aber die konvertierbare Schicht der BCL ist nicht sehr gut bekannt und es gibt möglicherweise einen guten Grund für den Unterschied (ich bin allerdings skeptisch)(string)null
, oder wenn Ihr Objekt o heißt, dann(string)o
In Anlehnung an JaredPars hervorragende Antwort auf die Überlastungsauflösung bleibt die Frage: "Warum wird
Convert.ToString(string)
null zurückgegeben, aberConvert.ToString(object)
zurückgegebenstring.Empty
?"Und die Antwort auf diese Frage ist ... weil die docs sagen so :
BEARBEITEN: Ob dies ein "Fehler in der Spezifikation", ein "sehr schlechtes API-Design", "warum wurde es so spezifiziert" usw. ist - ich werde einige Gründe untersuchen, warum ich es nicht sehe es als große Sache.
System.Convert
verfügt über Methoden zum Konvertieren jedes Basistyps in sich selbst . Dies ist seltsam - da keine Konvertierung erforderlich oder möglich ist, geben die Methoden nur den Parameter zurück.Convert.ToString(string)
verhält sich gleich. Ich nehme an, diese sind hier für Codegenerierungsszenarien.Convert.ToString(object)
hat 3 Möglichkeiten, wenn bestandennull
. Werfen, null zurückgeben oder string zurückgeben. Leer. Werfen wäre schlecht - doppelt so unter der Annahme, dass diese für generierten Code verwendet werden. Wenn Sie null zurückgeben, muss Ihr Anrufer eine Nullprüfung durchführen - wiederum keine gute Wahl für den generierten Code. String zurückgeben. Leer scheint eine vernünftige Wahl zu sein. Der RestSystem.Convert
befasst sich mit Werttypen, die einen Standardwert haben.Convert.ToString(string)
bedeutet, die Regel "Keine tatsächliche Konvertierung" zu brechen. DaSystem.Convert
es sich um eine statische Dienstprogrammklasse handelt, kann jede Methode logisch als ihre eigene behandelt werden. Es gibt nur sehr wenige reale Szenarien, in denen dieses Verhalten "überraschend" sein sollte. Lassen Sie also die Benutzerfreundlichkeit die (mögliche) Korrektheit gewinnen.quelle