3 votes

Y a-t-il une raison spécifique pour laquelle les propriétés et les méthodes portant le même nom sont interdites dans les classes mais autorisées comme méthodes d'extension ?

Je pensais à la fonctionnalité de List et je ne pensais pas au fait que Count() était une méthode d'extension lorsque j'ai fait la fausse supposition que je pouvais écrire une classe ayant une propriété et une méthode de même nom. La motivation dans mon esprit à l'époque était que je pouvais "paramétrer une propriété" pour des cas particuliers.

Je réalise maintenant que je peut le faire à condition que j'utilise une méthode d'extension.

Est-ce intentionnellement interdit dans les classes mais autorisé dans les extensions ou simplement une fonctionnalité inexistante ?

void Main()
{
    var list = new List<string>();

    // You compile code that gets the property named Count
    // and calls the method named Count()
    list.Add("x");
    Console.WriteLine (list.Count);
    list.Add("x");
    Console.WriteLine (list.Count());

    var c = new C();
    Console.WriteLine (c.Count);
    Console.WriteLine (c.Count());
}

public class C
{
    public int Count { get { return 3; } }

    // But you cannot compile a class that contains both a property
    // named Count and a method named Count()
    //public int Count () { return 0; } // <-- does not compile
}

public static class X 
{
    public static int Count(this C c)
    {
        return 4;
    }
}

3voto

Wiktor Zychla Points 23918

Je me souviens avoir posé cette question il y a 10 ans sur l'un des groupes Microsoft :

http://www.developmentnow.com/g/36_2003_9_0_0_195928/methods-and-properties-of-the-same-name.htm

et comme vous pouvez le voir, il n'y a pas eu de réponse convaincante.

Ceci est bien sûr facilement possible dans le CIL, car les propriétés traduites à paris de getXX / setXX métodos.

1voto

Tigran Points 41381

Cela s'explique par le fait que Count(this C c) est une méthode d'extension et ne fait pas réellement partie du type.

Cela signifie que vous pouvez avoir une méthode Count() sur C + extension Count() . Si vous l'appelez, elle sera appelée méthode d'instance.

Donc si nous pensons à une propriété, il y a encore moins de problèmes avec cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X