2010-10-22 60 views
0

我有兩個相同的方法。 一個是擴展方法和常規方法=>錯誤?

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); 
     } 

其中之一是一個擴展方法,而另一個不是。但是,這會導致錯誤「此調用不明確」

我該如何解決此問題?

+0

它編譯?擴展方法必須是靜態的... – BrunoLM 2010-10-22 23:32:09

回答

3

擴展方法應該是靜態的。

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

    } 
} 

擴展方法應該有一個靜態類和一個靜態方法。

+0

我相信這只是一個錯字 - 不會在沒有靜態修飾符的情況下編譯。 – 2010-10-22 23:48:33

+0

我只是想知道:如果一個擴展方法與類型中定義的方法具有相同的簽名,將永遠不會被調用:http://bit.ly/91A9Jn(通用指南),所以最重要的是什麼? – 2010-10-22 23:55:31

1

C# Version 3.0 Specificationsearch order是:在類型定義

  • 實例方法在當前名字空間在當前名字空間的父母
  • 擴展方法
  • 擴展方法的命名空間在
  • 擴展方法由「使用」導入的其他名稱空間

那麼你如何宣佈你的方法和地點?

0

我認爲錯誤不是由擴展方法造成的。

首先,擴展方法

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

(順便說一下,你錯過了static修改)將是曖昧與實例方法

public void ExtendFrameIntoClientArea(int amount) { } 

在類Window宣告但尚未有實例方法

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

無論在什麼樣的cla它宣佈。此外 - 據我記憶 - 實例方法優先於擴展方法 - 所以它們不應該與擴展方法模棱兩可。我建議再次查看錯誤消息,並確認您正在查看正確的方法。