私が理解しているように、各言語はそれ自身のdynamic
ハンドラを持つことができるので、適切なルールが適用されます。次のことが正しいか間違っているかどうかはわかりません。思考?"ダイナミック"を使用するインターフェイスベースのメソッド呼び出しは、C#のメソッド解決ルールに従っている必要がありますか?
シナリオ2つのいくつかの方法とのインタフェース(一方が他方を実装):
public interface IA {
void Bar(object o);
}
public interface IB : IA {
void Foo(object o);
}
と基本的なインプリメンテーション:
public class B : IB {
public void Foo(object o) { Console.WriteLine("Foo"); }
public void Bar(object o) { Console.WriteLine("Bar"); }
}
次に、通常のC#(NO dynamic
)と、我々がアクセスすることができますタイプIB
のターゲットからIA
の方法:
IB b = new B();
var o = new { y = "z" };
b.Foo(o.y); // fine
b.Bar(o.y); // fine
は、今度は、故意に全体のinvoke使用にdynamic
処理を行い、引数、(それはここではありませんが、一般的なケースでとして、これは、オーバーロードの解決に影響を与える可能性がある)に、いくつかのdynamic
を追加してみましょう。
IB b = new B();
dynamic x = new {y = "z"};
b.Foo(x.y); // fine
b.Bar(x.y); // BOOM!
失敗しますRuntimeBinderException
で:
'IB' は、それが私言う、今
'バー' の定義が含まれていません。 IB
と全く同じではありませんはBar
メソッドを持っています。しかしながら、第1の例に示すように、通常のC#規則では、ターゲットの宣言型がインタフェース(IB
)であるため、実装されることが知られている他のインタフェース(すなわちIA
)が過負荷解決の一部としてチェックされる。
So:これはバグですか?または私はそれを誤解していますか?
+1興味深い。私は、DLRがコンパイラ/ CLRとは対照的に、このようなことをあまりサポートしないのだろうかと思います。私はDLRがコールの解決を試みた責任があると思いますか? –
@Adam私の理解では、リフレクションベースの呼び出しでは、言語固有のプロバイダがあります。つまり、Microsoft.CSharp.RuntimeBinder.Binder'という言語規約に従ってください。 –
呼び出しを試みるクラスの継承と同じことを観察していますかベースメソッド? (継承されたインタフェースメソッドとは対照的に)。 –