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

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

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

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

4 ответа

Решение

Из документа "Новые функции в C# 4":

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

Это работы, которые я нахожу интересными, по крайней мере...

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

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

и назовите это так:

ClassWithMyProp x;
x.MyExt();
Другие вопросы по тегам