为什么64位转换枚举相关的CreateDelegate失败?

时间:2012-01-09 23:44:22

标签: c# delegates enums

在下面的代码片段中,使用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位枚举以这种方式工作的怪癖?

2 个答案:

答案 0 :(得分:2)

E64的基本类型为int而非long,这使其与返回类型为long的函数不兼容。 f32版本有效,因为E32int是兼容类型。

您可以通过E64将其基本类型设置为long来修复此示例

enum E64 : long {}

答案 1 :(得分:0)

这不是64位的枚举 您需要添加: long