所以我在这里尝试将带有随机签名的方法传递给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下工作。
答案 0 :(得分:4)
你必须强制转换为具体的委托类型,如下所示:
void Test()
{
Foo(A1);
Foo(A2);
Foo((Action<int>) M1);
Foo((Action<string, int>)M2);
}
原因是M1
和M2
是所谓的方法组。这只是意味着它们指的是一种或多种方法。为什么它不止一个?因为您可能有多个名称为M1的方法,每个方法都接受不同的参数集。但是,即使您只有一个重载,就像在您的情况下一样,可能有多个委托类型与该重载签名兼容(可能是Action<int>
或YourDelegateType
,它被声明为委托void YourDelegateType(int arg),或其他任何东西)。
这就是没有从方法组到委托的隐式转换的原因,您必须明确地将方法组转换为特定的委托类型。