为什么需要将方法强制转换为“动作”或“功能”以在值元组中使用它?

时间:2018-09-01 14:34:02

标签: c# .net tuples c#-7.0 valuetuple

为什么编译器无法处理这些x3x4分配?

    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 :(得分:2)

因为元组没有具体类型,除非将其强制转换为更具体的类型。您的GetX方法可以转换为各种委托类型。因此,您需要将其转换为特定的版本,编译器无法为您选择它。

原因类似于这种情况:

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