In vielen Kontexten, in denen eine Methode oder ein Operatorargument nicht vom erforderlichen Typ ist, versucht der C # -Compiler, eine implizite Typkonvertierung durchzuführen. Wenn der Compiler alle Argumente durch Hinzufügen impliziter Konvertierungen an seine Operatoren und Methoden anpassen kann, erfolgt dies ohne Beanstandung, auch wenn die Ergebnisse in einigen Fällen (insbesondere bei Gleichheitstests!) Überraschend sein können.
Ferner beschreibt jeder Werttyp wie int
oder short
tatsächlich sowohl eine Art von Wert als auch eine Art von Objekt (*). Es gibt implizite Konvertierungen, um Werte in andere Arten von Werten zu konvertieren und um jede Art von Wert in die entsprechende Art von Objekt zu konvertieren, aber die verschiedenen Arten von Objekten sind nicht implizit ineinander konvertierbar.
Wenn man den ==
Operator verwendet, um a short
und an zu vergleichen int
, short
wird das implizit in a konvertiert int
. Wenn sein numerischer Wert gleich dem von war int
, entspricht der Wert , int
mit dem er konvertiert wurde, dem, int
mit dem er verglichen wird. Wenn man versucht, die Equals
Methode für den Kurzschluss zu verwenden, um sie mit einer zu vergleichen int
, wäre die einzige implizite Konvertierung, die eine Überladung der Equals
Methode befriedigen würde, die Konvertierung in den entsprechenden Objekttyp int
. Wenn das short
gefragt wird, ob es mit dem übergebenen Objekt übereinstimmt, wird es feststellen, dass das fragliche Objekt int
eher ein als ein ist, short
und daraus schließen, dass es unmöglich gleich sein kann.
Obwohl sich der Compiler nicht darüber beschwert, sollte man im Allgemeinen vermeiden, Dinge zu vergleichen, die nicht vom gleichen Typ sind. Wenn man daran interessiert ist, ob die Konvertierung von Dingen in eine gemeinsame Form das gleiche Ergebnis liefern würde, sollte man eine solche Konvertierung explizit durchführen. Betrachten Sie zum Beispiel
int i = 16777217;
float f = 16777216.0f;
Console.WriteLine("{0}", i==f);
Es gibt drei Möglichkeiten, wie man ein int
mit einem vergleichen möchte float
. Man möchte vielleicht wissen:
- Entspricht der nächstmögliche
float
Wert int
dem float
?
- Stimmt die ganze Zahl mit dem
float
überein int
?
- Machen Sie das
int
und float
repräsentieren Sie den gleichen numerischen Wert.
Wenn man versucht, ein int
und float
direkt zu vergleichen , beantwortet der kompilierte Code die erste Frage; Ob der Programmierer dies beabsichtigt hat, ist jedoch alles andere als offensichtlich. Wenn Sie den Vergleich auf (float)i == f
ändern, wird klargestellt, dass die erste Bedeutung beabsichtigt war, oder (double)i == (double)f
der Code beantwortet die dritte Frage (und es wird klargestellt, dass dies beabsichtigt ist).
(*) Selbst wenn die C # -Spezifikation einen Wert vom Typ betrachtet, z. System.Int32
B. ein Objekt vom Typ System.Int32
, wird einer solchen Ansicht die Anforderung widersprochen, dass ein Code auf einer Plattform ausgeführt wird, deren Spezifikation Werte und Objekte als Bewohner verschiedener Universen betrachtet. Wenn T
es sich um einen Referenztyp handelt und x
es sich um einen handelt T
, T
sollte sich eine Referenz vom Typ beziehen können x
. Wenn also eine Variable v
vom Typ Int32
eine enthält Object
, sollte eine Referenz vom Typ Object
eine Referenz v
oder deren Inhalt enthalten können. Tatsächlich könnte eine Referenz vom Typ Object
auf ein Objekt verweisen, das Daten enthält, die von kopiert wurden v
, jedoch nicht auf sich v
selbst oder dessen Inhalt. Das würde darauf hindeuten, dass wederv
noch sein Inhalt ist wirklich ein Object
.