似乎在C#中,参数名称可以参与扩展方法的解析。这是一个示例:
class Program
{
static void Main(string[] args)
{
var x = 1.Do1(b: 1);
var x2 = 1.Do1(c: 1);
Console.WriteLine(x);
Console.WriteLine(x2);
}
}
public static class Ext1
{
public static int Do1(this int a, int b)
{
return 1;
}
}
public static class Ext2
{
public static int Do1(this int a, int c)
{
return 2;
}
}
在此程序中,编译器能够推断出对Do1
的第一次调用是对Ext1.Do1
的调用,而第二次调用是对Ext2.Do1
的调用,因为我指定了争论。
这是C#的文档功能吗?哪里?我找不到它。
答案 0 :(得分:4)
是的,它已记录在Microsoft的官方文档中,称为重载分辨率。
尽管这是很普通的事情(例如,它适用于所有地方),所以您得到的结果是正常的。
报价:
使用命名参数和可选参数会影响 通过以下方式:
如果每个方法,索引器或构造函数都可以执行, 参数的名称是可选的还是对应的(按名称或按 位置,到调用语句中的单个参数,并且 参数可以转换为参数的类型。
如果找到多个候选者,则针对 首选转换将应用于显式指定的参数 指定。忽略可选参数的省略参数。
如果两个候选人被判定为同样出色,则优先考虑 没有可选参数的候选对象 在通话中被省略了。这是一般情况的结果 重载解决方案优先考虑的候选对象较少 参数。
答案 1 :(得分:0)
正如@Haytam指出的那样,此过程称为Overload Resolution。 Expressions的C# language specifications部分对此进行了描述。
首先,要找到最佳的重载,必须找到所有可能的重载集合,称为适用的函数成员。有很多规则可以找到重载。您可能会猜到,这两个方法是方法调用的有效候选者。 但是,在您的情况下,编译器会根据显式参数采用更具体的参数。