0

为什么以下调用不明确:

public class Foo
{
    public void Bar<T> (Action<T> simple);
    public void Bar<T1, T2> (Action<T1, T2> complex);
}

...

public class Test
{
    public static void MyComplex (string a, string b) { ... }
}

...

foo.Bar(Test.MyComplex);

编译器不应该清楚调用该Bar<T1,T2>()方法吗?

4

2 回答 2

1

如果你删除这个方法public void Bar<T> (Action<T> simple);,你的代码就不会编译,因为你得到这个异常:

无法从用法中推断出方法“Foo.Bar(System.Action)”的类型参数。尝试明确指定类型参数。

不幸的是,编译器无法从此方法中获取类型,您应该编写以下代码来调用方法:

new Foo().Bar(new Action<string, string>(Test.MyComplex));
于 2013-09-21T09:16:23.510 回答
0

编译器试图推断通用参数类型,Bar但要做到这一点,它需要知道所有参数类型。您拥有的参数 ( Test.MyComplex) 实际上是方法组,而不是委托,因此编译器还需要插入到兼容委托类型的转换。但是它不能,因为它不知道要使用什么委托类型,因为对它需要兼容的方法的类型推断尚未完成。有一个先有鸡还是先有蛋的问题,编译器放弃说这个调用是模棱两可的。Eric Lippert 在对一个非常相似的问题的评论中指出,在这样的简单情况下,可以解决它,但代价是使重载解决规则复杂化。

不幸的是,您需要做一些事情来为编译器提供更多信息:

foo.Bar<string, string>(Test.MyComplex);

或者

Action<string, string> action = Test.MyComplex;
foo.Bar(action);
于 2013-09-21T09:38:27.807 回答