Neben all den tollen Antworten bisher:
Sie haben eine "Beobachter-Voreingenommenheit". Sie beobachten keine Bugs und gehen daher davon aus, dass es keine gibt.
Früher habe ich so gedacht wie du. Dann habe ich angefangen, professionell Compiler zu schreiben, und ich sage Ihnen, da sind viele Fehler drin!
Sie sehen die Fehler nicht, weil Sie Code schreiben, der genau wie 99,999% des restlichen Codes ist, den die Leute schreiben. Sie schreiben wahrscheinlich ganz normalen, unkomplizierten, klar korrekten Code, der Methoden aufruft und Schleifen ausführt und nichts Besonderes oder Verrücktes tut, weil Sie ein normaler Entwickler sind, der normale Geschäftsprobleme löst.
Es werden keine Compiler-Fehler angezeigt, da die Compiler-Fehler nicht in den einfach zu analysierenden normalen Codeszenarien enthalten sind. Die Fehler liegen in der Analyse von seltsamem Code, den Sie nicht schreiben.
Ich hingegen habe die gegenteilige Beobachter-Tendenz. Ich sehe jeden Tag den ganzen Tag verrückten Code, und für mich scheinen die Compiler voller Fehler zu sein.
Wenn Sie sich mit der Sprachspezifikation einer beliebigen Sprache abgesetzt und eine Compiler-Implementierung für diese Sprache vorgenommen haben und sich wirklich bemüht haben, festzustellen, ob der Compiler die Spezifikation genau implementiert hat oder nicht, und sich auf dunkle Eckfälle konzentrieren, werden Sie ziemlich bald fündig Compiler-Fehler ziemlich häufig. Lassen Sie mich Ihnen ein Beispiel geben, hier ist ein C # -Compiler-Fehler, den ich vor fünf Minuten buchstäblich gefunden habe.
static void N(ref int x){}
...
N(ref 123);
Der Compiler gibt drei Fehler an.
- Ein ref- oder out-Argument muss eine zuweisbare Variable sein.
- Die beste Übereinstimmung für N (ref int x) hat ungültige Argumente.
- Fehlendes "ref" bei Argument 1.
Offensichtlich ist die erste Fehlermeldung korrekt und die dritte ist ein Fehler. Der Fehlergenerierungsalgorithmus versucht herauszufinden, warum das erste Argument ungültig war, untersucht es, stellt fest, dass es eine Konstante ist, und kehrt nicht zum Quellcode zurück, um zu überprüfen, ob es als "ref" markiert wurde. Vielmehr wird davon ausgegangen, dass niemand so dumm wäre, eine Konstante als ref zu markieren, und es wird entschieden, dass der ref fehlen muss.
Es ist nicht klar, was die richtige dritte Fehlermeldung ist, aber das ist es nicht. Tatsächlich ist auch nicht klar, ob die zweite Fehlermeldung korrekt ist. Sollte die Überladungsauflösung fehlschlagen oder sollte "ref 123" als ref-Argument des richtigen Typs behandelt werden? Ich muss jetzt darüber nachdenken und es mit dem Triage-Team besprechen, damit wir feststellen können, wie es sich richtig verhält.
Sie haben diesen Fehler noch nie gesehen, weil Sie wahrscheinlich niemals etwas so Dummes tun würden, um zu versuchen, 123 per ref zu übergeben. Und wenn ja, würden Sie wahrscheinlich nicht einmal bemerken, dass die dritte Fehlermeldung unsinnig ist, da die erste richtig und ausreichend ist, um das Problem zu diagnostizieren. Aber ich versuche solche Sachen zu machen, weil ich versuche , den Compiler kaputt zu machen. Wenn Sie es versuchen würden, würden Sie auch die Fehler sehen.