程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [C#] 委托與方法組

[C#] 委托與方法組

編輯:C#入門知識

在編寫委托相關代碼,尤其是泛型委托相關代碼的時候,經常會遇到下面這種問題:   定義一個委托類型: [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);    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved