bni*_*dyc 2 c# extension-methods
看下面的代码:
class A
{
public string DoSomething(string str)
{
return "A.DoSomething: " + str;
}
}
class B : A
{
}
static class BExtensions
{
public static string DoSomething(this B b, string str)
{
return "BExtensions.DoSomething: " + str;
}
}
class Program
{
static void Main(string[] args)
{
var a = new A();
var b = new B();
Console.WriteLine(a.DoSomething("test"));
Console.WriteLine(b.DoSomething("test"));
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
代码的输出是:
A.DoSomething:测试
A.DoSomething:测试
编译时,它不会发出警告.
我的问题是:为什么在代码编译时没有警告,以及在DoSomething调用方法时究竟发生了什么?
调用该方法时会发生什么很简单:只是实例方法调用.由于C#是早期绑定的,因此所有方法都在编译时解析.此外,实例方法比扩展方法更受欢迎,因此这就是永远不会调用扩展方法的原因.
看到这个:
您可以使用扩展方法来扩展类或接口,但不能覆盖它们.永远不会调用与接口或类方法具有相同名称和签名的扩展方法.在编译时,扩展方法的优先级始终低于类型本身中定义的实例方法.
换句话说,如果类型具有名为的方法
Process(int i),并且您具有具有相同签名的扩展方法,则编译器将始终绑定到实例方法.当编译器遇到方法调用时,它首先在类型的实例方法中查找匹配项.如果未找到匹配项,它将搜索为该类型定义的任何扩展方法,并绑定到它找到的第一个扩展方法.
| 归档时间: |
|
| 查看次数: |
581 次 |
| 最近记录: |