C 匿名方法與Delegate型別轉換錯誤

2021-09-06 19:46:58 字數 1139 閱讀 1150

問題描述  

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....