2012-09-18 61 views
2

如果我使用本機方法創建具有相同簽名的擴展方法(EM),會發生什麼情況。如果有兩種方法具有相同的簽名,會發生什麼情況。一種本地和二次擴展方法?

我的情況
我創建了一個擴展方法

public static class EM 
{ 
    public static void ForEach<T>(this List<T> enu, Action<T> action) 
    {    
     foreach (T item in enu) 
      action(item); 
    } 
} 

現在,因爲名單也有相同的簽名功能

public void ForEach(Action<T> action); 

所以名單我也

List<Label> re = new List<Label>(); 
re.ForEach(x => Foo(x)); 

這編譯和運行,但它不會調用我的EM,而是調用其本地方法。我相信,它不會顯示有2個重載,因爲超載,必須有在signtaure

enter image description here

查詢
Q1一些變化。這是爲什麼發生?
Q2。如果有更多的參數,那麼我可以改變參數順序並調用它。但是,我怎麼讓他用相同數量的參數呼叫我的EM(這是我的問題的一個非常簡單的解釋,我的EM可能是一個複雜的問題)?

+0

'IEnumerable的

+0

@leppie:你的答案適用於'IEnumerable '。但現在問題已經改變。現在該方法需要'此列表' –

+0

我認爲這是對這個問題的一個有趣的補充。 http://stackoverflow.com/questions/4655209/how-to-hide-a-member-method-by-an-extension-method – Carth

回答

4

C#將始終調用該類的方法,而不是調用擴展方法。我建議在方法的名稱中添加一些內容以區分它。我個人最後使用Ex,因爲它很短,並提醒我這是一種擴展方法。

public static class EM 
{ 
    public static void ForEachEx<T>(this List<T> enu, Action<T> action) 
    {    
     foreach (T item in enu) 
      action(item); 
    } 
} 
+1

'在調用'它應該'而不是調用'' –

+0

@NikhilAgrawal謝謝指向爲了清楚起見。 – Kleinux

相關問題