stackoverflow上有人問,為什么不能把委托放在一個接口當中?
投票最多的第一個答案第一句話說,“A Delegate is just another type, so you don't gain anything by putting it inside the interface.”
翻譯過來大致意思就是:委托只是一種類型,把委托放在接口中你什么也得不到。
看上去挺拗口的,如果你也感覺這句話說的不知所雲,那么只能求助於MSDN的接口和委托的定義。
接口:只包含方法、屬性、事件或索引器的簽名。 實現接口的類或結構必須實現接口定義中指定的接口成員。
委托:是一種定義方法簽名的類型。 當實例化委托時,您可以將其實例與任何具有兼容簽名的方法相關聯。 您可以通過委托實例調用方法。
似乎還不能讓人滿意,我們看到接口中可以包含事件,再想一想事件和委托之間的關系,想一想常見的Delegate、EventHandler、 Predicate、Func、Action…
為什么接口中可以有事件而不能包含委托?
你現在有沒有陷入混亂而無語的恐慌當中?
換個角度從接口和委托的IL代碼來看本質,其實說清楚為什么不能把delegate放在一個interface當中非常簡單。
先看一個簡單的接口定義:

ISampleInterface
IL反匯編代碼如下:
我們看到接口的定義中,方法、屬性、索引器還有事件,本質上都是方法。其中索引器對應於get_Item,set_Item方法,屬性對應get_Message,set_Message方法,而事件對應於add_MyHandler和remove_MyHandler方法。所以說屬性、索引器還有事件只是語法糖而已。
我們再看下MSDN的委托示例:
public delegate int PerformCalculation(int x, int y);
它的反匯編代碼如下:
根據IL,我們發現編譯器自動將委托生成為一個繼承自System.MulticastDelegate的類。
所以回頭看委托的定義還是很有深刻意義的,委托只是一種定義方法簽名的類型。而我們平時說自定義一個類型,通常就是自定義一個類,其實還應該包括自定義一個委托。
分析到這里,我們可以得出結論,接口內只能定義本質為方法的成員,不能定義類。
為什么不能把委托(delegate)放在一個接口(interface)當中?因為委托是一個類,而接口當中不能定義類。
參考:
http://stackoverflow.com/questions/612957/why-cant-i-put-a-delegate-in-an-interface