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 intoder shorttatsä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 shortund an zu vergleichen int, shortwird das implizit in a konvertiert int. Wenn sein numerischer Wert gleich dem von war int, entspricht der Wert , intmit dem er konvertiert wurde, dem, intmit dem er verglichen wird. Wenn man versucht, die EqualsMethode für den Kurzschluss zu verwenden, um sie mit einer zu vergleichen int, wäre die einzige implizite Konvertierung, die eine Überladung der EqualsMethode befriedigen würde, die Konvertierung in den entsprechenden Objekttyp int. Wenn das shortgefragt wird, ob es mit dem übergebenen Objekt übereinstimmt, wird es feststellen, dass das fragliche Objekt inteher ein als ein ist, shortund 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 intmit einem vergleichen möchte float. Man möchte vielleicht wissen:
- Entspricht der nächstmögliche
floatWert intdem float?
- Stimmt die ganze Zahl mit dem
floatüberein int?
- Machen Sie das
intund floatrepräsentieren Sie den gleichen numerischen Wert.
Wenn man versucht, ein intund floatdirekt 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)fder 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.Int32B. 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 Tes sich um einen Referenztyp handelt und xes sich um einen handelt T, Tsollte sich eine Referenz vom Typ beziehen können x. Wenn also eine Variable vvom Typ Int32eine enthält Object, sollte eine Referenz vom Typ Objecteine Referenz voder deren Inhalt enthalten können. Tatsächlich könnte eine Referenz vom Typ Objectauf ein Objekt verweisen, das Daten enthält, die von kopiert wurden v, jedoch nicht auf sich vselbst oder dessen Inhalt. Das würde darauf hindeuten, dass wedervnoch sein Inhalt ist wirklich ein Object.