我有一个代码段如下:
routes.php
运行程序,输出" 13",表示调用类N的扩展方法。为什么M类的方法不匹配?
然后,如果我删除N类,OK,则调用M类的扩展方法,它输出" 9"如预期的那样。
所以我的问题是,C#或.net框架中是否有规则来确定,如果存在多个匹配项,将调用哪个扩展方法?这是否与重载解析规则或其他相关?
非常感谢。
答案 0 :(得分:8)
与所有其他方法一样,相同的重载规则适用于扩展方法。使用N
因为它是更好的匹配。 M
可能有一个可选参数,但是no参数选项更适合,因为规则支持使用最少参数的选项。
来自Named and Optional Arguments (C# Programming Guide):
然而,"亲近"也可以使用扩展方法,如Eric Lippert's blog:中所述如果两个候选人被判断为同样好,则优先选择没有可选参数的候选人,其中参数在呼叫中被省略。这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。
这样做的结果是,如果您将代码重组为:
namespace X
{
public static class N
{
public static int Plus(this int i)
{
return i + 10;
}
}
}
namespace ConsoleApplication1
{
public static class M
{
public static int Plus(this int i, int p = 6)
{
return i + p;
}
}
internal class Program
{
private static void Main()
{
int i = 3.Plus();
Console.WriteLine(i);
}
}
}
然后显示的数字为9
。换句话说,选择具有可选参数的版本,因为它在同一名称空间中,因此"更接近"。
答案 1 :(得分:5)
这与扩展方法无关。在重载决策算法的打破平局阶段,与不应用默认参数的调用匹配的方法优先于需要应用所述默认参数以匹配调用的方法。
如C# specification所述,请参阅第154页
[...]如果MP的所有参数都有相应的参数,而默认参数需要替换MQ中的至少一个可选参数,那么MP优于MQ。