在編寫委托相關代碼,尤其是泛型委托相關代碼的時候,經常會遇到下面這種問題: 定義一個委托類型: [csharp] public delegate void TestDelegate<T>(T arg); 定義一個測試用的類,及方法: [csharp] public class TestClass { public void TestFunc4Delegate(int arg){} public void TestFunc1(Delegate dele){} public void TestFunc2<T>(TestDelegate<T> dele){} } 測試用的代碼: [csharp] 1. TestClass tc = new TestClass(); 2. tc.TestFunc1(tc.TestFunc4Delegate); 3. tc.TestFunc2(tc.TestFunc4Delegate); 然後會發現,上面的測試用代碼有編譯錯誤,其中第二行的編譯錯誤是“無法從方法組轉換為System.Delegate”,第三行的編譯錯誤是“無法從用法中推導出TestClass.TestFunc2<T>(TestDelegate<T>)的類型實參”。 以上報錯的核心問題就在“方法組”上。“方法組”是一個編譯器概念,由於C#支持方法重載,所以名字相同的方法可能會有多種重載實現方式,這所有的名稱相同的重載方法合在一起就成為一個方法組。上面的例子中tc.TestFunc4Delegate實際上指向的是名為Test4Delegate的方法組,盡管上面的類定義中並沒有對Test4Delegate做任何重載,它依然是一個方法組。 既然是方法組,那麼問題就來了——無法確定需要的到底是方法組中的哪一個重載。正因為確定不了,所以編譯器無法決定用什麼委托子類型來創建委托實例,同樣也就無法推導出泛型的正確類型。 想要讓上例中的調用可以通過編譯,就必須指定限定類型,如這樣: [csharp] tc.TestFunc1((TestDelegate<int>)tc.TestFunc4Delegate); tc.TestFunc2<int>(tc.Test4Delegate);