为什么我需要将方法强制转换为`Action`或`Func`以在值元组中使用它?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么我需要将方法强制转换为`Action`或`Func`以在值元组中使用它?相关的知识,希望对你有一定的参考价值。

为什么编译器无法处理这些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;
    }
答案

因为元组没有具体类型,除非您将其转换为更具体的类型。您的GetX方法可以转换为各种委托类型。所以你需要将它转换为特定的一个,编译器不能为你选择它。

原因与此案相似:

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

以上是关于为什么我需要将方法强制转换为`Action`或`Func`以在值元组中使用它?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 iOS 应用程序中的变量或强制转换为空? [复制]

泛型和强制转换 - 不能将继承的类强制转换为基类

未经检查的强制转换:尝试在同一方法中将 Int 或 String 强制转换为 T(泛型类型)

float型怎样强制转换成int型

【LabVIEW开发】数据类型转换

是否有更直接的方法将float转换为int而不是添加0.5f并使用截断转换?