国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

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

2019-11-17 02:44:27
字體:
來源:轉載
供稿:網友
C#匿名方法與Delegate類型轉換錯誤

問題描述

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

2 PRivate void App()

3 {

4 XXControl.Invoke(new DoSomething(() =>

5 {

6 //DoSomething的具體操作

7 }));

8 }

這樣做可以是可以, 但使用匿名方法則更好, 最起碼看上去更簡潔.

0 private void App()

1 {

2 XXControl.Invoke(delegate

3 {

4 //DoSomething的具體操作

5 });

6 }

上面的代碼會在編譯的時候出錯: Cannot convert anonymous method to type System.Delegate because it is not a delegate type. 方法要求參數的是一個委托(delegate)類型, 而現在傳遞的只是一個匿名方法. 產生這個錯誤最根本的原因是編譯器在處理匿名方法的時候, 沒法推斷出這個委托的方法返回的是什么類型, 也就不知道返回一個什么樣的委托.

解決方法 要解決上面這個問題, 從根本上來說就是指定這個匿名方法將會返回什么類型的委托, 有幾種方法:

1. 使用MethodInvoke或者Action

0 private void App()

1 {

2 XXControl.Invoke((MethodInvoker)delegate()

3 {

4 //DoSomething的具體操作

5 });

6 } 0 private void App()

1 {

2 XXControl.Invoke((Action)delegate()

3 {

4 //DoSomething的具體操作

5 });

6 }

MethodInvoke和Action都是方法返回類型為空的委托.

2. 可以給Control定義一個Invoke的擴展方法

0 public static void Invoke(this Control control, Action action)

1 {

2 control.Invoke((Delegate)action);

3 }

調用的時候則可以這樣調用:

0 //使用委托

1 XXControl.Invoke(delegate { //DoSomething here});

2 //使用lambda表達式

3 XXControl.Invoke(()=>{ //DoSomething here});

參考 1.http://stackoverflow.com/questions/253138/anonymous-method-in-invoke-call

2.http://staceyw1.Wordpress.com/2007/12/22/they-are-anonymous-methods-not-anonymous-delegates/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 许昌市| 四子王旗| 青川县| 工布江达县| 建水县| 新田县| 凉山| 松原市| 彭阳县| 西乌珠穆沁旗| 博客| 泽州县| 内江市| 开封县| 洪泽县| 天镇县| 聂荣县| 凭祥市| 勃利县| 玉门市| 南阳市| 梓潼县| 响水县| 信丰县| 德昌县| 正蓝旗| 太康县| 余庆县| 全州县| 建湖县| 吕梁市| 肃宁县| 滦平县| 融水| 合山市| 靖州| 新巴尔虎左旗| 麻江县| 夏河县| 苏尼特右旗| 昌吉市|