C #: почему я не могу использовать динамический параметр в методе расширения? - PullRequest
0 голосов
/ 30 сентября 2018

Почему я не могу использовать динамический параметр в методе расширения, как в следующем коде:

public static class Extension
{
    public static void ExtMethod(this Program pg, object asdf) {
        new Program();
    }
}

public class Program
{
    static void Main(string[] args)
    {
        dynamic d = new ExpandoObject();
        d.test = "test";
        new Program().ExtMethod(d.test);
        Extension.ExtMethod(new Program(), d.test);
    }
}    

new Program().ExtMethod(d.test); вызывает ошибку времени компиляции.

Но Extension.ExtMethod(new Program(), d.test); не вызывает никаких ошибок.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Это дизайн и часть спецификации.Из стандарта ECMA C # 5, раздел 12.7.6.3:

При вызове метода (§12.6.6.2) одной из форм [...], если обычная обработка вызова не находитПрименительно к соответствующим методам делается попытка обработать конструкцию как вызов метода расширения. Если expr или какой-либо из аргументов имеет динамический тип времени компиляции, методы расширения не будут применяться.

Основная причина этого заключается в том, что динамическое связывание предназначено длятот же результат, что и при связывании во время компиляции ... но для методов расширения это будет означать сохранение всех директив using во время выполнения.Это было бы возможно , но я подозреваю, что это будет очень дорого с точки зрения производительности вызова, и команда разработчиков C # решила не идти этим путем.

0 голосов
/ 30 сентября 2018

Вам нужно привести d.test к объекту, другими словами написать;

new Program().ExtMethod((object)d.test);

...