Además de todas las grandes respuestas hasta ahora:
Tienes un "sesgo de observador". No observa errores y, por lo tanto, asume que no hay ninguno.
Solía pensar como tú. Entonces empecé a escribir compiladores profesionalmente, y déjame decirte que hay muchos errores ahí.
No ves los errores porque escribes un código que es como el 99.999% del resto del código que la gente escribe. Probablemente escriba código perfectamente normal, directo y claramente correcto que llame a métodos y ejecute bucles y no haga nada sofisticado o extraño, porque usted es un desarrollador normal que resuelve problemas comerciales normales.
No ves ningún error en el compilador porque los errores del compilador no se encuentran en los escenarios de código normal, fáciles de analizar; Los errores están en el análisis de código extraño que no escribes.
Por otro lado, tengo el sesgo de observador opuesto. Veo código loco todo el día todos los días, y para mí los compiladores parecen estar llenos de errores.
Si te sentaste con la especificación de lenguaje de cualquier idioma, tomaste cualquier implementación del compilador para ese lenguaje y realmente intentaste determinar si el compilador implementó exactamente la especificación o no, concentrándote en casos oscuros de esquina, muy pronto lo harás. Estar encontrando errores de compilación con bastante frecuencia. Déjame darte un ejemplo, aquí hay un error del compilador de C # que encontré literalmente hace cinco minutos.
static void N(ref int x){}
...
N(ref 123);
El compilador da tres errores.
- Un argumento de referencia o de salida debe ser una variable asignable.
- La mejor coincidencia para N (ref int x) tiene argumentos no válidos.
- Falta "ref" en el argumento 1.
Obviamente, el primer mensaje de error es correcto y el tercero es un error. El algoritmo de generación de errores está tratando de averiguar por qué el primer argumento no fue válido, lo observa, ve que es una constante y no regresa al código fuente para verificar si estaba marcado como "ref"; más bien, asume que nadie sería tan tonto como para marcar una constante como referencia, y decide que falta la referencia.
No está claro cuál es el tercer mensaje de error correcto, pero no lo es. De hecho, tampoco está claro si el mensaje de error second es correcto. ¿Debería fallar la resolución de sobrecarga o debería tratarse "ref 123" como un argumento ref del tipo correcto? Ahora tendré que pensarlo un poco y hablarlo con el equipo de clasificación para que podamos determinar cuál es el comportamiento correcto.
Nunca has visto este error porque probablemente nunca harías algo tan tonto como para tratar de pasar el 123 por ref. Y si lo hiciera, probablemente ni siquiera notaría que el tercer mensaje de error no tiene sentido, ya que el primero es correcto y suficiente para diagnosticar el problema. Pero trato de hacer cosas así, porque estoy intentando romper el compilador. Si lo intentas, también verías los errores.