为什么64位铸造枚举相关的CreateDelegate失败?
问题描述:
在下面的代码片段中,使用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://*.com/a/4026609/14582有关这个奇怪的代码的某些方面,它是由这个答案的启发)匹配代码?或者这是32位枚举以这种方式工作的怪癖吗?
答
基本类型E64
是int
而不是long
这使得它与返回类型为long
的函数不兼容。因为E32
和int
是兼容的类型,所以f32版本起作用。
可以通过具有E64
设置它的基本类型解决这个样品long
enum E64 : long {}
答
这不是一个64位枚举。
您需要新增: long
。
唉,我刚刚意识到我错过了E64上的“:long”。毕竟工作良好。关闭这个。 – scobi 2012-01-09 23:47:43
你的枚举都是32位。使用'E64:long'来创建一个64位枚举。 – CodesInChaos 2012-01-09 23:48:38