Una dudilla sobre C#

Publicado 31/12/2008 11:40 por Eduard Tomàs i Avellana

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

Archivado en:
Comparte este post:

Comentarios

# re: Una dudilla sobre C#

Wednesday, December 31, 2008 1:07 PM by Luis Fraile

Hmmm buena pregunta Eduard ... habrá que investigarlo

por cierto, que usted lo pase bien esta noche ... con su segundo de más incluido

# re: Una dudilla sobre C#

Wednesday, December 31, 2008 2:06 PM by Anto'

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.

# re: Una dudilla sobre C#

Wednesday, December 31, 2008 5:26 PM by Eugenio Estrada

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

# re: Una dudilla sobre C#

Wednesday, December 31, 2008 11:46 PM by Octavio Hernández

Eduard,

La especificación es clara al respecto. En el cap. 10, "Classes", pág. 430 de CSPL3 (geeks.ms/.../cspl3-ya-disponible.aspx) dice:

"Una <declaración-de-clase> crea un nuevo espacio de declaraciones, y las <declaraciones-de-miembros> contenidas directamente dentro de la <declaración-de-clase> 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!

# re: Una dudilla sobre C#

Thursday, January 01, 2009 3:55 PM by El Bruno

El gran Octavio al rescate !!! y yo aporto 2 detalles insignificantes:

- Feliz 2009 :D

- Console 232 ?? eso son 232 proyectos de consola que han pasado por esa pc, que crack !!!

Saludos

# re: Una dudilla sobre C#

Thursday, January 08, 2009 4:05 PM by Eduard Tomàs i Avellana

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... :P :P :P