Hola… a punto todos para comernos las uvas????
Antes de que lo hagáis y os lanceis luego a brindar con cava por el nuevo año, y una cosa lleve a la otra y no esteis en condiciones, digamos de… pensar mucho, a ver si alguien me sabe responder una dudilla que me ha surgido hoy.
¿Porque este código no compila?
public class Foo { public string Name { get { return string.Empty; } } public string Name() { return string.Empty ; } }
Por si alguien (como yo) se pensaba que eso compilaba, pues no. Visual Studio se queja con un claro y explÃcito error CS0102: The type ‘ConsoleApplication232.Foo’ already contains a definition for ‘Name’.
Alguien sabe el porque de esta limitación? Es decir, porque han evitado que podamos hacer esto? Alguien tiene alguna idea?
Epa!!! Buen año a tod@s y que el 2009 os sea lo más propicio posible!!!! Y no os comáis las uvas antes de tiempo! Recordad que el último minuto de este 2008 tiene un segundillo de más!!! xD
Hmmm buena pregunta Eduard … habrá que investigarlo
por cierto, que usted lo pase bien esta noche … con su segundo de más incluido
Porque a efectos de reflexión, el método se considera como propiedad (por ejemplo, cuando haces delegados podrÃas referirte a «Name» para pasarlo como parámetro de tipo método), lo cual el nombre de Name es ambiguo.
Yo iba más allá, tanto un método, como una propiedad, como una variable, se define dentro del CLR como un Type y no puede haber 2 type en el mismo ámbito con mismo nombre :).
Por otra parte aun que compilase no creo que ese código cumpla mucho el CTS para la compatibilidad con otros lenguajes.
Un saludo,
Eugenio
Eduard,
La especificación es clara al respecto. En el cap. 10, «Classes», pág. 430 de CSPL3 (http://geeks.ms/blogs/ohernandez/archive/2008/10/22/cspl3-ya-disponible.aspx) dice:
«Una crea un nuevo espacio de declaraciones, y las contenidas directamente dentro de la introducen nuevos miembros en ese espacio. Las siguentes reglas se aplican a las declaracioes de miembros:
…
– El nombre de una constante, campo, propiedad, evento o tipo debe ser distinto de todos los demás nombres de miembros declarados en la clase.
…
O sea, que si una propiedad se llama Name, no puede haber ningún otro miembro de la clase que se llame Name.
¡Feliz año!
El gran Octavio al rescate !!! y yo aporto 2 detalles insignificantes:
– Feliz 2009 😀
– Console 232 ?? eso son 232 proyectos de consola que han pasado por esa pc, que crack !!!
Saludos
Hola a todos!
Gracias por los comentarios… 🙂
@Octavio
La verdad no me he habÃa leÃdo las especificaciones (no se ha notado, eh?? jejjeeee :p). A mi personalmente me sorprendió que no compilase y aunque en las especificaciones está bien claro, sigo sin entender porque no nos dejan hacer eso.
Quizás es para compatibilidad con VB o algún otro lenguaje. En VB6 creo que se podia llamar a un método sin parámetros sin usar los paréntesis. En este caso, es evidente, se puede confundir un método Foo() con una propiedad Foo {get;}
Pero probé de hacer esto en VB2008 y no pude: el propio IDE me ponÃa los paréntesis, asà que asumà que en VB.NET estos se deben usar siempre… (si hay alguien de VB.NET que lo pueda aclarar…).
@Bruno
Feliz 2009 a tà también, claro… y a todos los lectores de geeks.ms! Y no… no son 232 proyectos… es que les cambio el nombre para que parezca que trabajo más… 😛 😛 😛