扩展方法重载

Byy*_*yyo 2 c# extension-methods

我有这种扩展方法

public static class Extensions
{
     public static void ConsoleWriteLine(this object Value)
     {
         Console.WriteLine(Value);
     }
}
Run Code Online (Sandbox Code Playgroud)

对于整数值我有一点修改

public static void ConsoleWriteLine(this int Value)
{
    Console.WriteLine("Integer: " + Value);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:当我写下int x = 1; x.ConsoleWriteLine();决定在这种情况下采取第二次延期的时候?intobject藏汉

D S*_*ley 5

是什么决定在这种情况下采取第二次延期?

当编译器有多个有效方法可供选择时,它使用一组重载决策规则来确定它应绑定到哪个方法.第二种扩展方法与调用签名完全匹配,因此选择它.由于任何其他类型可直接转换为object,因此将选择第一个扩展名.其他数字类型可以隐式转换为int,但隐式转换并不比直接转换为父类"更好".

我相信这里的相关规范是7.5.3.2:

7.5.3.2更好的功能成员

为了确定更好的函数成员,构造一个精简的参数列表A,它按照它们在原始参数列表中出现的顺序仅包含参数表达式本身.每个候选函数成员的参数列表按以下方式构造:

...

给定一个参数列表A,其中包含一组参数表达式{E1,E2,...,EN}和两个适用的函数成员MP和MQ,参数类型为{P1,P2,...,PN}和{Q1,Q2, ...,QN},MP被定义为比MQ更好的函数成员if

  • 对于每个参数,从EX到QX的隐式转换并不比从EX到PX的隐式转换更好

由于"转化率"从intint的是,从转换"更好的" intobject时,int过载会被选中.

请注意,这适用于所有重载,而不仅仅是扩展方法(尽管有不同的规则可以打破扩展和非扩展方法之间的联系).