通过参数名称解​​析扩展方法

时间:2019-04-07 17:09:14

标签: c#

似乎在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#的文档功能吗?哪里?我找不到它。

2 个答案:

答案 0 :(得分:4)

是的,它已记录在Microsoft的官方文档中,称为重载分辨率
尽管这是很普通的事情(例如,它适用于所有地方),所以您得到的结果是正常的。

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments#overload-resolution

报价:

  

使用命名参数和可选参数会影响   通过以下方式:

     

如果每个方法,索引器或构造函数都可以执行,   参数的名称是可选的还是对应的(按名称或按   位置,到调用语句中的单个参数,并且   参数可以转换为参数的类型。

     

如果找到多个候选者,则针对   首选转换将应用于显式指定的参数   指定。忽略可选参数的省略参数。

     

如果两个候选人被判定为同样出色,则优先考虑   没有可选参数的候选对象   在通话中被省略了。这是一般情况的结果   重载解决方案优先考虑的候选对象较少   参数。

答案 1 :(得分:0)

正如@Haytam指出的那样,此过程称为Overload ResolutionExpressionsC# language specifications部分对此进行了描述。

首先,要找到最佳的重载,必须找到所有可能的重载集合,称为适用的函数成员。有很多规则可以找到重载。您可能会猜到,这两个方法是方法调用的有效候选者。 但是,在您的情况下,编译器会根据显式参数采用更具体的参数。