C#:传递一个带有变量参数的方法作为另一个方法的参数

时间:2016-11-21 09:00:10

标签: c#

所以我在这里尝试将带有随机签名的方法传递给Foo方法。但没有任何运气 问题是我可以通过任何行动。但是在一种方法上 有什么帮助吗?

class Bar
{
    void M1(int a) { }
    void M2(string a, int b) { }

    Action<string, int, bool> A1 = (s, i, b) => {};
    Action<int, float> A2 = (i, f) => {};

    void Foo(Delegate f) {}

    void Test()
    {
        Foo(A1);
        Foo(A2);
        // Foo(M1); // nope
        // Foo(M2); // no way
    }
}

PS。我试图在Unity3d的Mono下工作。

1 个答案:

答案 0 :(得分:4)

你必须强制转换为具体的委托类型,如下所示:

void Test()
{
    Foo(A1);
    Foo(A2);
    Foo((Action<int>) M1);
    Foo((Action<string, int>)M2); 
}

原因是M1M2是所谓的方法组。这只是意味着它们指的是一种或多种方法。为什么它不止一个?因为您可能有多个名称为M1的方法,每个方法都接受不同的参数集。但是,即使您只有一个重载,就像在您的情况下一样,可能有多个委托类型与该重载签名兼容(可能是Action<int>YourDelegateType,它被声明为委托void YourDelegateType(int arg),或其他任何东西)。

这就是没有从方法组到委托的隐式转换的原因,您必须明确地将方法组转换为特定的委托类型。