Tejas Antwort ist korrekt. Um genauer auf einige Ihrer Punkte einzugehen:
Warum führt der folgende Code nicht zum Kompilierungsfehler?
Die Frage ist nicht zu beantworten; es erzeugt keinen Fehler, weil es ein gesetzlicher Code ist, aber das ist eine Tautologie.
Wenn Ihre Frage tatsächlich lautet: "Welcher Abschnitt der C# Spezifikation macht dies legal?", Dann ist das eine beantwortbare Frage. Der Abschnitt über aufgehobene Gleichstellungsoperatoren macht es legal.
Es wird ein Referenztyp mit einem primitiven Typ verglichen.
Es ist nicht. Vermeiden Sie zunächst den Begriff "primitiver Typ"; Die Spezifikation definiert es nicht klar und es ist kein nützliches Konzept in C#. Sie wollten sagen, ich denke, dass es einen Wert des Referenztyps mit einem Wert des Werttyps vergleicht.
Zweitens ist das auch nicht korrekt. Das Null-Literal ist nicht vom Referenztyp oder Werttyp; es ist nicht von Art. Es ist umwandelbar zu jedem Nullwerttyp oder jedem Referenztyp, aber es ist von keinem Typ nur für sich.
In diesem Fall wird das Null-Literal in den Nullwert-Bool-Typ konvertiert.
Sowohl Null als auch False müssen in etwas interpretiert werden, damit der Compiler einen Vergleich durchführen kann.
Korrekt. Sie werden als nullbare Boole interpretiert.
sucht der Parser einfach nach einem solchen Muster und ersetzt es durch false?
Nein, aber das ist eine ausgezeichnete Schätzung. Der Compiler würde Constant-Falte sagen true == false
bis zu false
, aber es führt keine Faltungsoptimierungen durch, die NULL-Werttypen enthalten. Die Sprache könnte neu entworfen werden, um eine konstante Faltung bei Operationen mit Nullwert-Operanden zu unterstützen; hatte Nullwertwerte kontrafaktisch in Version eins, das vorgeschlagene Feature wäre wahrscheinlich unterstützt worden.
Werttyp oder nicht, 'false' ist immer noch ein Objekt. Es wird wahrscheinlich für den Vergleich eingerahmt werden. – cHao
@cHao: Ihre Vermutung ist falsch. Der Gleichheitsoperator wurde speziell entwickelt, um Boxen zu vermeiden. Lesen Sie die Spezifikation für Details. –