Hoy va un post rapidito sobre un curioso detalle sintáctico de C# que me llamó la atención hace algún tiempo, mientras leía el artículo How to Stress the C# Compiler, donde Henning Dieterichs comenta varias formas de estresar (¡literalmente!) al compilador de C# utilizando construcciones admitidas por el lenguaje.La cuestión es: ¿por qué no compila el siguiente código?
class Program {
public static void Main() {
int f = 0; int x = 0; int y = 0;
System.Console.WriteLine(
"{0} {1}",
f < x, // is f smaller than x?
y > (-1) // is y greater than -1?
);
}
}
¡No sigáis leyendo! Echad un vistazo al código e intentad averiguarlo antes de ver la solución :)
He de decir que los comentarios "
//" en el código contribuyen significativamente al despiste, pero la respuesta es bastante sencilla. Basta con eliminar ruido y reformatear un poco el código para verlo más claro:class Program {
public static void Main() {
int f = 0; int x = 0; int y = 0;
System.Console.WriteLine(
"{0} {1}",
f<x,y>(-1)
);
}
}
De esta forma, llegamos rápido a la conclusión de que el código conflictivo f<x,y>(-1) es sintácticamente correcto desde dos puntos de vista muy diferentes:- Dos parámetros suministrados a
Console.WriteLine(), escritos como expresiones condicionales independientes:f < xy > (-1)
- Una llamada a un método genérico
f<x,y>, suministrándole el valor-1.
f<x,y>() (bueno, y de hecho ni siquiera x e y son tipos, sino variables).Curioso, ¿verdad?
Publicado en Variable not found.
Es curioso cuanto menos, sin embargo, me gustaría saber si hay más literatura sobre que regla sigue el compilador para dar prioridad a la segunda interpretación.
ResponderEliminar¡Un saludo!
Hola!
ResponderEliminarPues si la hay, no la conozco :-/ Pero supongo que, con tiempo y paciencia, aquí se podrá ver algo:
LanguageParser.cs.
Saludos!
Muy curioso!
ResponderEliminarHabrá que usar paréntesis