44

C#4のキーワードについての話を聞いていて、疑問に思っているのですが... この機能は他の .NET 機能と直交するものでしょうか? たとえば、拡張メソッドをサポートするのでしょうか?dynamic

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

4 に答える 4

48

「C#4の新機能」ワードドキュメントから:

動的ルックアップは拡張メソッドを見つけることができません。拡張メソッドが適用されるかどうかは、呼び出しの静的コンテキスト(つまり、どのusing句が発生するか)に依存し、このコンテキスト情報は現在、ペイロードの一部として保持されていません。

于 2008-11-03T15:33:36.500 に答える
4

これは私が少なくとも興味深いと思う作品です...

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

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

それでも、コンパイラがコンパイル時に正しい拡張メソッドを見つけることができる場合、実行時に検索される一連の拡張メソッドをパッケージ化できない理由がわかりませんか? 非メンバー メソッドの v-table のようなものです。

編集:

これはクールだ... http://www2.research.att.com/~bs/multimethods.pdf

于 2009-11-30T22:39:49.747 に答える
2

機能しません。拡張メソッドは、ファイルに名前空間が含まれているかどうかに応じて機能します。私の知る限り、MSIL はファイルと名前空間を含むことについて何も知りません。

于 2008-11-20T17:53:19.980 に答える
1

objectの拡張メソッドを作成し、それをdynamicに割り当てることができます:

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

次のように呼び出します。

ClassWithMyProp x;
x.MyExt();
于 2013-02-01T17:17:36.313 に答える