Будет ли динамическое ключевое слово в С# 4 поддерживать методы расширения?

Я прослушивание беседы о ключевом слове С# 4 dynamic, и мне интересно... Будет ли эта функция ортогональна другим функциям .NET, например, будет ли она поддерживать методы расширения?

public static class StrExtension {
    public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
x.twice(); // will this work?

Примечание: Этот вопрос задавали до того, как был отправлен С# 4, поэтому он формулируется в будущем.

Ответ 1

Из "Новые возможности в С# 4" word doc:

Динамический поиск не сможет найти методы расширения. Будь то методы расширения применяются или нет. в статическом контексте вызова (то есть, которые используют положения), и эта контекстная информация не в настоящее время хранятся как часть полезной нагрузки.

Ответ 2

Это работает, что мне интересно, по крайней мере...

public static class StrExtension
{
   public static string twice(this string str) { return str + str; }
}

...
dynamic x = "Yo";
StrExtension.twice(x);

Тем не менее, если компилятор может найти правильный метод расширения во время компиляции, тогда я не понимаю, почему он не может упаковать набор методов расширения, которые нужно искать во время выполнения? Это будет похоже на v-таблицу для методов, отличных от членов.

EDIT:

Это круто... http://www2.research.att.com/~bs/multimethods.pdf

Ответ 3

Он не может работать, методы расширения работают в зависимости от наличия пространства имен, включенных в файл, и, насколько я знаю, MSIL не имеет понятия о файлах и в том числе пространства имен.

Ответ 4

Вы можете создать метод расширения для объекта и назначить его динамическому:

public static void MyExt(this object o) {
    dynamic d = o;
    d.myProp = "foo";
}

и назовите его следующим образом:

ClassWithMyProp x;
x.MyExt();