C#4の動的キーワードは拡張メソッドをサポートしますか?
-
06-07-2019 - |
質問
C#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?
注:この質問はC#4が出荷される前に尋ねられたため、将来形で表現されています。
解決
動的ルックアップはできません 拡張メソッドを見つけます。かどうか 拡張メソッドが適用されるかどうか 呼び出しの静的コンテキストで (つまり、どのusing句が発生するか)、および このコンテキスト情報は 現在、ペイロードの一部として保持されています。
他のヒント
これは少なくとも面白いと思う作品です...
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();
所属していません StackOverflow