Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用与现有方法同名的扩展方法?_C#_Extension Methods - Fatal编程技术网

C# 如何调用与现有方法同名的扩展方法?

C# 如何调用与现有方法同名的扩展方法?,c#,extension-methods,C#,Extension Methods,我有这样的代码 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 Exten

我有这样的代码

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.");
    }
}
现在如果我把MethodA叫做

TestA a = new TestA();
        a.MethodA();

它将始终调用原始方法。如何调用扩展方法。

您不能将扩展方法作为普通扩展方法调用。实例方法使用相同的签名重写扩展方法

编辑:

可以将其称为静态方法

ExtensionTest.MethodA(a);

您可以像调用任何其他静态方法一样调用扩展方法:

ExtenstionTest.MethodA(a);

一种扩展方法,其名称和签名与 永远不会调用接口或类方法。在编译时, 扩展方法的优先级始终低于在类型本身中定义的实例方法

可以将扩展方法作为类的常规静态方法调用

ExtenstionTest.MethodA(a);

换句话说,如果一个类型有一个名为Process(inti)的方法,那么 如果有具有相同签名的扩展方法,编译器将 始终绑定到实例方法。当编译器遇到 方法调用时,它首先在类型的实例中查找匹配项 方法。如果没有找到匹配项,它将搜索任何扩展名 为类型定义并绑定到第一个扩展的方法 它找到的方法。下面的示例演示 编译器确定要绑定的扩展方法或实例方法 对

不能将其作为扩展方法调用。就扩展方法而言,在这一点上它基本上是无用的。(我个人希望这是一个警告,但没关系。)

编译器在尝试解析扩展方法之前,会尝试所有可能的实例方法。根据C#4规范第7.6.5.2节:

在其中一个表单的方法调用中[…]如果调用的正常处理未找到适用的方法,则尝试将构造作为扩展方法关联进行处理

后来:

前面的规则意味着实例方法优先于扩展方法

您可以像调用常规静态方法一样调用它:

// Fixed typo in name
ExtensionTest.MethodA(a);

正如其他人所建议的,您不能调用此方法。调用此方法的唯一方法是:

TestA a = new TestA();
ExtenstionTest.MethodA(a);

那解决不了我的问题。但谢谢你的回答……不客气。其思想是,如果您想将扩展方法用作真正的扩展方法,那么如果您有一个具有相同签名的实例方法,则不能使用它,因为该实例方法将始终优先于扩展方法:)+1作为第一个正确答案,我想我知道是谁投了反对票:如果其他人已经提出了,发布相同的答案而不带来任何新的东西有什么意义?+1对你来说。上面的新东西是“唯一的方式”:)是的。但其他人已经说过,这也是一个微小的变化