【发布时间】:2015-02-25 00:43:50
【问题描述】:
我遇到了一个不明确的奇怪情况,但重载解析器不这么认为。考虑:
public static class Program
{
delegate int IntDel();
delegate string StringDel();
delegate void ParamIntDel(int x);
delegate void ParamStringDel(string x);
static void Test(IntDel fun) { }
static void Test(StringDel fun) { }
static void ParamTest(ParamIntDel fun) { }
static void ParamTest(ParamStringDel fun) { }
static int X() { return 42; }
static void PX(int x) { }
public static void Main(string[] args)
{
ParamTest(PX); // OK
Test(X); // Ambiguos call!
}
}
为什么对ParamTest 重载的调用被正确解析,而Test 重载却是模棱两可的?
【问题讨论】:
-
编译器选择重载时不考虑方法的返回类型。调用方法时实际上不必使用返回值的自动结果。这里随便解决了,用
Test(new IntDel(X)); -
我相信 Java 和 C++ 也是如此。然而,这不是参数多态性的基本限制,例如在 Haskell 中,您可以根据返回类型进行重载。问题是允许对返回类型进行重载可能会导致类型推断出现一些问题。
-
Offtopic:我喜欢这些天几乎所有问题都会获得至少 1 票赞成票。 XD
标签: c# delegates overload-resolution