Зачем мне приводить методы к `Action` или` Func`, чтобы использовать их в кортежах значений? - PullRequest
0 голосов
/ 01 сентября 2018

Почему компилятор не может обработать эти x3 и x4 назначения?

    void X()
    {
        (Func<int, int>, int) x1 = (GetX, 1);           // OK
        object x2 = x1;                                 // OK
        object x3 = (GetX, 1);                          // Error CS8135 Tuple with 2 elements cannot be converted to type 'object'.
        object x4 = (GetX, 1) as (Func<int, int>, int); // Error CS8307 The first operand of an 'as' operator may not be a tuple literal without a natural type.
        object x5 = ((Func<int, int>, int))(GetX, 1);   // OK
        object x6 = ((Func<int, int>)GetX, 1);          // OK
    }

    int GetX(int x)
    {
        return x;
    }

1 Ответ

0 голосов
/ 01 сентября 2018

Поскольку у кортежа нет конкретного типа, если вы не приведете его к более конкретному типу. Ваш метод GetX может быть преобразован в различные типы делегатов. Поэтому вам нужно привести его к конкретному, компилятор не может выбрать его для вас.

Причина аналогична этому случаю:

Delegate del = x => x * 2; // err
Delegate del2 = (Func<int,int>)(x => x * 2); // OK
...