2012-07-02 59 views
3

我有兩個通用委託,我試圖定義編譯器抱怨他們是重複的,但在我看來是完全不同的。我在做什麼/理解錯誤?泛型委託重複定義 - 爲什麼?

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, IItem item); 

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, int field, IItem item); 

如果我添加一個新的泛型參數到第二委託,一切正常。

delegate TReturn foo<TParameter, TField, out TReturn>(TParameter parameter, TField field, IItem item) where TField struct 

但這看起來不正確。我將永遠爲場傳遞一個int - 它不應該是一個通用的。

+0

什麼是確切的編譯錯誤? – Steven

+0

錯誤是「命名空間'xxx'已經包含'foo'」的定義。這種說法有道理,但我無法真正解釋它。 – Rawling

+1

我想你可以通過在這裏刪除泛型來簡化問題。假設你有兩個委託:'delegate void f()'和'delegate void f(int)',然後你得到一個委託對象:'fa;',你不知道從哪個委託的版本對象被實例化。調用'a(1)'的'a()'是不安全的,因爲你不知道委託對象是否實際上代表了一個0或1參數的方法。因此,委託不像可以重載的方法 – weidi

回答

4

代表不是方法。他們知道如何調用方法,但他們自己不是方法(委託是object),因此不能像方法那樣重載。

請參閱this post瞭解爲什麼它是不可能的。

3

當使用delegate關鍵字時,幕後發生的事情是編譯器根據其定義生成一個類。所以,當你像這樣定義一個委託:

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, IItem item); 

一個下面的類是從它產生:

class foo<TParameter, out TReturn> : MulticastDelegate 
{ 
    public void Invoke(TParameter parameter, IItem item) { ... } 
    .... 
} 

正如你所看到的,當你有兩個代表具有相同的名稱和相同的通用參數,它會導致生成兩個相同的類,這當然是不可接受的。

我推薦傑弗裏裏希特的一本很棒的書CLR via C#,它可以讓你更多地瞭解像這樣的幕後故事 - 還有更多。