扩展方法和常规方法=>错误?

时间:2010-10-22 23:29:41

标签: c# c#-4.0 extension-methods

我有两种相同的方法。 一个是

    public void ExtendFrameIntoClientArea(Window w, int amount)
    {
        if (internals.DwmIsCompositionEnabled())
        {
            WindowInteropHelper wi = new WindowInteropHelper(w);
            internals.DwmExtendFrameIntoClientArea(wi.Handle, new internals.MARGINS(amount));
        }
    }

,另一个是

public void ExtendFrameIntoClientArea(this Window w,int amount)
        {
            this.ExtendFrameIntoClientArea(w, amount);
        }

其中一个是扩展方法,另一个不是。但是,这会导致错误“此调用不明确”

我将如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

扩展方法应该是静态的。

public static class XExtender
{
    public static void A(this X x)
    {
        x.A(x);
    }
}
public class X
{
    public void A(X x)
    {

    }
}

扩展方法应该有静态类和静态方法。

答案 1 :(得分:1)

根据C# Version 3.0 Specificationsearch order是:

  • 类型定义中的实例方法
  • 当前命名空间中的扩展方法
  • 当前命名空间的父命名空间中的扩展方法
  • “using”
  • 导入的其他命名空间中的扩展方法

那么你如何宣告你的方法以及在哪里?

答案 2 :(得分:0)

我认为错误不是由扩展方法引起的。

首先,扩展方法

public static void ExtendFrameIntoClientArea(this Window w, int amount) { }

(顺便说一下,你错过了static修饰符)与实例方法不一致

public void ExtendFrameIntoClientArea(int amount) { }

在类Window中声明,但没有使用实例方法

public void ExtendFrameIntoClientArea(Window w, int amount) { }

无论宣布什么职业。进一步 - 据我所知 - 实例方法优先于扩展方法 - 所以它们永远不应该与扩展方法不明确。我建议再次查看错误消息并验证您正在查看正确的方法。