インターフェイスを実装する値型メソッドへのオープン インスタンス デリゲートを作成しようとすると、Delegate.CreateDelegate が失敗します。インスタンス メソッドは値型であるため、最初の引数は ref である必要があります。このため、一般的なデリゲート型を定義しましょう。
delegate T2 VF<T0, T1, T2>(ref T0 arg0, T1 arg1);
次に、int.ToString(string) へのオープン インスタンス デリゲートの作成に成功するが、int.Equals(int) へのオープン インスタンス デリゲートの作成に失敗するプログラムを次に示します。
class Program
{
static void Main(string[] args)
{
var tos = typeof(int).GetMethod("ToString", new[] { typeof(string) });
var tosopen = Delegate.CreateDelegate(
typeof(VF<int, string, string>), null, tos);
// success!
var eq = typeof(int).GetMethod("Equals", new[] { typeof(int) });
var eqopen = Delegate.CreateDelegate(
typeof(VF<int, int, bool>), null, eq);
// previous line fails with "Error binding to target method"
}
}
これは int.Equals(int) が を実装しているためと思われますIEquatable<int>
。以下が機能することに注意してください。
var x = typeof(IEquatable<int>).GetMethod("Equals", new Type[] { typeof(int) });
var xopen = Delegate.CreateDelegate(
typeof(Func<IEquatable<int>, int, bool>), null, x);
xopen(1,1); // returns true
しかし、これは最初の引数として渡された整数をボックス化するように見えるため、私が望んでいるものとはまったく異なります。また、 を比較したくありませんIEquatable<int>
。具体的にメソッドを呼び出して、2 つの int を比較したいと考えています。
ここで何が間違っているかについて何か考えはありますか?
Microsoft Connect のバグがここで言及されましたが、これは直接関連していると思われますが、そのリンクは機能しなくなり、検索してもそのバグを見つけることができません。
編集:オーバーライドされたメソッドへのオープンインスタンスデリゲートを作成しようとすると同じ問題が発生するため、インターフェイスメソッドだけではないことに注意してください。