2012-01-09 60 views
0

在下面的代码片段中,使用64位枚举对CreateDelegate的调用会引发ArgumentException“错误绑定到目标方法”。然而,32位枚举工作正常。为什么64位铸造枚举相关的CreateDelegate失败?

有人能告诉我为什么吗?

是不是有什么特殊的约64位枚举,使这个失败,也许在结合说法未实现的代码路径:

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有关这个奇怪的代码的某些方面,它是由这个答案的启发)匹配代码?或者这是32位枚举以这种方式工作的怪癖吗?

+0

唉,我刚刚意识到我错过了E64上的“:long”。毕竟工作良好。关闭这个。 – scobi 2012-01-09 23:47:43

+0

你的枚举都是32位。使用'E64:long'来创建一个64位枚举。 – CodesInChaos 2012-01-09 23:48:38

回答

2

基本类型E64int而不是long这使得它与返回类型为long的函数不兼容。因为E32int是兼容的类型,所以f32版本起作用。

可以通过具有E64设置它的基本类型解决这个样品long

enum E64 : long {} 
+0

是的,我发布了5秒后才意识到。哎呀。 – scobi 2012-01-09 23:49:06

+1

@ScottBilas有时候,找出答案的最简单方法是向其他人解释问题:)。完全。 – JaredPar 2012-01-09 23:49:58

+0

完全。 :)这里的酒吧也很高。在点击全能提交按钮之前,确实需要确保我的场地正确无误。 99%不够好! – scobi 2012-01-09 23:59:39

0

这不是一个64位枚举。
您需要新增: long