Una dudilla sobre C#

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

6 comentarios sobre “Una dudilla sobre C#”

  1. 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.

  2. 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

  3. 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!

  4. 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

  5. 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… 😛 😛 😛

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *