[C#] Pourquoi le compilateur C # ne corrige pas le code où une méthode statique appelle une méthode d'instance?


Answers

Foo a un paramètre "x" qui est dynamique, ce qui signifie que Bar (x) est une expression dynamique.

Il serait parfaitement possible pour l'exemple d'avoir des méthodes comme:

static Bar(SomeType obj)

Dans ce cas, la méthode correcte sera résolue, donc l'instruction Bar (x) est parfaitement valide. Le fait qu'il existe une méthode d'instance Bar (x) est irrelevent et n'est même pas considéré: par définition , Bar (x) étant une expression dynamique, nous avons reporté la résolution à runtime.

Question

Le code suivant a une méthode statique, Foo() , appelant une méthode d'instance, Bar() :

public sealed class Example
{
    int count;

    public static void Foo( dynamic x )
    {
        Bar(x);
    }

    void Bar( dynamic x )
    {
        count++;
    }
}

Il compile sans erreur * mais génère une exception de liant d'exécution au moment de l'exécution. Suppression du paramètre dynamique à ces méthodes provoque une erreur de compilation, comme prévu.

Alors pourquoi avoir un paramètre dynamique permet de compiler le code? ReSharper ne le montre pas non plus comme une erreur.

Édition 1: * dans Visual Studio 2008

Edit 2: ajouté sealed car il est possible qu'une sous-classe puisse contenir une méthode Bar(...) statique. Même la version scellée compile lorsqu'il n'est pas possible qu'une méthode autre que la méthode d'instance puisse être appelée lors de l'exécution.






Links