問題描述
c#2.0出現了匿名方法, 這在一定程度上節省了我們維護**上下文的精力, 也不需要思考為某個方法取什麼名字比較合適. 在fcl的一些方法中要求傳入乙個delegate型別的引數, 比如control.invoke或者control.begininvoke方法:
0 public object invoke(delegate method);
1 public iasyncresult begininvoke(delegate method);
在這種情況下, 如果不使用匿名方法, 則需要在**的上面先宣告乙個delegate void dosomething()方法, 然後可以在invoke方法中再用lambda表示式或者委託實現dosomething().
0 delegate void dosomething();
1
3 ));
8 }這樣做可以是可以, 但使用匿名方法則更好, 最起碼看上去更簡潔.
1 );
6 }上面的**會在編譯的時候出錯: cannot convert anonymous method to type system.delegate because it is not a delegate type. 方法要求引數的是乙個委託(delegate)型別, 而現在傳遞的只是乙個匿名方法. 產生這個錯誤最根本的原因是編譯器在處理匿名方法的時候, 沒法推斷出這個委託的方法返回的是什麼型別, 也就不知道返回乙個什麼樣的委託.
解決方法 要解決上面這個問題, 從根本上來說就是指定這個匿名方法將會返回什麼型別的委託, 有幾種方法:
1. 使用methodinvoke或者action
1 );
1 );
6 }methodinvoke和action都是方法返回型別為空的委託.
2. 可以給control定義乙個invoke的擴充套件方法
0 public static void invoke(this control control, action action)
1 呼叫的時候則可以這樣呼叫:
0 //使用委託
1 xxcontrol.invoke(delegate );
2 //使用lambda表示式
3 xxcontrol.invoke(()=>);
C 匿名方法與Delegate型別轉換錯誤
c 2.0出現了匿名方法,這在一定程度上節省了我們維護 上下文的精力,也不需要思考為某個方法取什麼名字比較合適.在fcl的一些方法中要求傳入乙個delegate型別的引數,比如control.invoke或者control.begininvoke方法 public object invoke del...
C 匿名方法與Delegate型別轉換錯誤分析
問題描述 c 2.0出現了匿名方法,這在一定程度上節省了我們維護 上下文的精力,也不需要思考為某個方法取什麼名字比較合適.在fcl的一些方法中要求傳入乙個delegate型別的引數,比如control.invoke或者control.begininvoke方法 複製 如下 public object...
匿名類與擴充套件方法
var可以根據變數的初始值自動推斷區域性變數的型別 var只能定影區域性變數,而不能定義成員變數 定義的時候必須同時完成初始化,而不能使用var定義變數為null var本身並不是一種新的型別,只是用來修飾乙個可推斷出具體型別的區域性變數 var定義變數和object型別定義的區別 console....