2012-02-22 9 views
6

私は次のヘルパーデリゲートR関数<T,R>(T t)をFunc <T,R>に変換するにはどうすればよいですか?

public delegate R Function<T, R>(T t); 

を定義し、レガシーコードを持っている。しかし、私はFunc<T,TResult>

キャスト試みがコンパイルに失敗提供したい

に型「System.Func<T,TResult>」を変換できません " Rhino.Mocks.Function<T,TResult> '

方法はありますか帽子はコンパイルするだけでなく、実行時に機能しますか?

答えて

9

問題は2種類の異なるデリゲートタイプ(Func<T, TResult>Function<T, TResult>)を組み合わせようとしていることです。彼らは同じシグネチャを持っていますが、それらは異なるので、互換性のないタイプです。

ラムダを使用して2つの間に変換レイヤーを作成します。

Func<T, TResult> func = ...; 
TheMethod(x => func(x)); 
+0

ああ、右。物事を書き出すことは私の最後の手段です。 SOが許可すると受け入れます。 – Maslow

8

あなたはJaredParが示唆するようにラムダを作成、または他のコンストラクタに1を渡すことができます:

Func<int, string> f1 = i => i.ToString(); 
Function<int, string> f2 = new Function<int, string>(f1); 
+1

ラムダ式を修正するための@EricLippertのおかげで、私は午後のうちいくつかをF#で作業するのに費やしていました。これは '=>'の代わりに ' - >'を使います。 – phoog

9

ジャレッドとphoogは両方とも正しいです。ちょうどそれを仕上げるために、同じことを行うための第三の方法は、次のとおりです。

Func<int, string> func = i => i.ToString(); 
Function<int, string> function = func.Invoke; 

新しいデリゲートが正しいシグネチャを持つ最初のデリゲートのinvokeメソッドをに委譲され、すなわち。

これを行う必要があるのは極端な場合です。ランタイムを最初から設計していたのですが、私たちが現在デリゲート型をどのように使用しているかを知っていれば、のいずれかがデリゲート型で構築されている可能性が高いと思います。( "single 3次元配列の整数型)、あるいはデリゲート型の間に「構造的同一性」があることを示します。次回、仮想マシンのタイプシステムを設計するときは、そのことを念頭に置いてください。

+0

ランタイムがこの問題を攻撃する正しいレベルであるかどうかはわかりません。特に、私はこれらの変更がパラメータ名とどれだけうまくやりとりするのかよくわかりません。 – CodesInChaos

+0

この機能を実装していない場合(テストを必要としない、他の機能から離れた時間、-100ポイントではなく0ポイントで開始するなど)、実装する際に大きな欠点がありますか? – Brian

+0

私が正しく理解していれば、それはコンパイルされないので、ランタイムが正常であるとは助けになりません。 – Maslow

関連する問題