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();
决定在这种情况下采取第二次延期的时候?int
是 object
藏汉
是什么决定在这种情况下采取第二次延期?
当编译器有多个有效方法可供选择时,它使用一组重载决策规则来确定它应绑定到哪个方法.第二种扩展方法与调用签名完全匹配,因此选择它.由于任何其他类型可直接转换为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的隐式转换更好
由于"转化率"从int
到int
的是,从转换"更好的" int
到object
时,int
过载会被选中.
请注意,这适用于所有重载,而不仅仅是扩展方法(尽管有不同的规则可以打破扩展和非扩展方法之间的联系).