Почему 64-битное приведение перечисления, связанное с перечислением CreateDelegate, терпит неудачу? - PullRequest
0 голосов
/ 10 января 2012

В приведенном ниже фрагменте кода при вызове CreateDelegate с 64-битным перечислением выдается исключение ArgumentException «Ошибка привязки к целевому методу». И все же 32-битный enum работает нормально.

Может кто-нибудь сказать мне, почему?

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 ]

2 голосов
/ 10 января 2012

Базовый тип E64 равен int, а не long, что делает его несовместимым с функцией, имеющей тип возвращаемого значения long. Версия f32 работает, потому что E32 и int совместимые типы.

Вы можете исправить этот образец, установив E64 его базовый тип на long

enum E64 : long {}
0 голосов
/ 10 января 2012

Это не 64-битное перечисление.
Вам нужно добавить : long.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...