2012-01-09 4 views
0

以下のコードスニペットでは、64ビット列挙型のCreateDelegateを呼び出すとArgumentException "ターゲットメソッドへのバインドエラー"がスローされます。 32ビットのenumはうまく動作します。64ビットキャスト列挙関連のCreateDelegateが失敗するのはなぜですか?

誰かが私にその理由を教えてもらえますか?

class Test 
{ 
    public static void DoIt() 
    { 
     Func<int, int> f32 = i => i; 
     var d32 = (Func<int, E32>)Delegate.CreateDelegate(typeof(Func<int, E32>), f32.Method); 

     Func<long, long> f64 = i => i; 
     var d64 = (Func<long, E64>)Delegate.CreateDelegate(typeof(Func<long, E64>), f64.Method); 
    } 
} 

enum E32 { }; 
enum E64 { }; 

(この奇妙なコードにいくつかの状況では、それはこの答えに触発されています:https://stackoverflow.com/a/4026609/14582

これは失敗になり、64ビットの列挙型についての特別な何か、結合引数で、おそらく実装されていないコードパスがあります一致するコード?それとも、32ビット列挙型がこのように動作するかどうかは不思議ですか?

+0

bah、私はちょうど私がE64に ":long"を見逃していることに気づいた。結局、うまく動作します。これを閉じます。 – scobi

+0

両方の列挙型は32ビットです。 'E64:long'を使って64ビットのenumを作ります。 – CodesInChaos

答えて

2

ベースタイプE64intではなく、longであり、戻りタイプがlongの関数と互換性がありません。 f32バージョンは、E32intが互換性のあるタイプであるため動作します。

あなたはそれが64ビットの列挙型ではありませんlong

enum E64 : long {} 
+0

ええ、投稿後5秒で実現しました。おっとっと。 – scobi

+1

@ScottBilas時々、答えを理解する最も簡単な方法は、他の人に問題を説明することです:)。 – JaredPar

+0

:)バーはここでもとても高いです。全部の送信ボタンを押す前に私の構内が正しいことを本当に確認する必要があります。 99%で十分ではありません! – scobi

0

に基本型ですE64セットを持っていることによって、このサンプルを修正することができます。
: longを追加する必要があります。

関連する問題