D J*_*D J 23 c# extension-methods
可能重复:
C#中是否有任何方法可以使用扩展方法覆盖类方法?
我的代码就像
public class TestA
{
public string ColA { get; set; }
public string ColB { get; set; }
public string ColC { get; set; }
public void MethodA()
{
MessageBox.Show("Original A1.");
}
}
static class ExtenstionTest
{
public static void MethodA(this TestA A1)
{
MessageBox.Show("Extended A1.");
}
}
Run Code Online (Sandbox Code Playgroud)
现在如果我把MethodA称为
TestA a = new TestA();
a.MethodA();
Run Code Online (Sandbox Code Playgroud)
它总是会调用Original方法.如何调用扩展方法.
Mih*_*hai 36
您不能将扩展方法称为普通扩展方法.实例方法使用相同的签名覆盖扩展方法
编辑:
您可以将其称为静态方法
ExtensionTest.MethodA(a);
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 17
您不能将其称为扩展方法.就扩展方法而言,此时基本上没用.(我个人认为这是一个警告,但没关系.)
编译器在尝试解析扩展方法之前尝试所有可能的实例方法.从C#4规范的7.6.5.2节:
在调用其中一种形式的方法中,如果调用的正常处理找不到适用的方法,则尝试将该构造作为扩展方法调用进行处理.
然后:
前面的规则意味着实例方法优先于扩展方法
您可以像常规静态方法一样调用它:
// Fixed typo in name
ExtensionTest.MethodA(a);
Run Code Online (Sandbox Code Playgroud)
永远不会调用与接口或类方法具有相同名称和签名的扩展方法.在编译时, 扩展方法的优先级始终低于类型本身中定义的实例方法.
您可以将扩展方法称为类的常规静态方法.
ExtenstionTest.MethodA(a);
Run Code Online (Sandbox Code Playgroud)
来自MSDN
换句话说,如果类型具有名为Process(int i)的方法,并且您具有具有相同签名的扩展方法,则编译器将始终绑定到实例方法.当编译器遇到方法调用时,它首先在类型的实例方法中查找匹配项.如果未找到匹配项,它将搜索为该类型定义的任何扩展方法,并绑定到它找到的第一个扩展方法.以下示例演示了编译器如何确定要绑定的扩展方法或实例方法.
| 归档时间: |
|
| 查看次数: |
7514 次 |
| 最近记录: |