在下面的代码片段中,使用64位枚举调用CreateDelegate会抛出ArgumentException“绑定到目标方法的错误”。然而,32位枚举工作正常。
有人可以告诉我为什么吗?
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 :(得分:2)
E64
的基本类型为int
而非long
,这使其与返回类型为long
的函数不兼容。 f32版本有效,因为E32
和int
是兼容类型。
您可以通过E64
将其基本类型设置为long
来修复此示例
enum E64 : long {}
答案 1 :(得分:0)
这不是64位的枚举
您需要添加: long
。