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

2022-09-26 08:03:09 字數 1394 閱讀 2622

問題描述 

c#2.0出現了匿名方法, 這在一定程度上節省了我們維護**上下文的精力, 也不需要思考為某個方法取什麼名字比較合適. 在fcl的一些方法中要求傳入乙個delegate型別的引數, 比如control.invoke或者control.begininvoke方法:

複製** **如下:

public object invoke(delegate method);

public iasyncresult begininvoke(delegate method);

在這種情況下, 如果不使用匿名方法, 則需要在**的上面先宣告乙個delegate void dosomething()方法, 然後可以在invoke方法中再用lambda表示式或者委託實現dosomething().

複製** **如下:

delegate void dosomething();

private void app()

));

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

複製** **如下:

private void app()

); }

上面的**會在編譯的時候出錯: cannot convert anonymous method to t system.delegate because it is not a delegate type. 方法要求引數的是乙個委託(delegate)型別, 而現在傳遞的只是乙個匿名方法. 產生這個錯誤最根本的原因是編譯器在處理匿名方法的時候, 沒法推斷出這個委託的方法返回的是什麼型別, 也就不知道返回乙個什麼樣的委託.

解決方法

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

1. 使用methodinvoke或者action

複製** **如下:

private void app() xsgsjqdus

); }

private void app()

); }

methodinvoke和action都是方法返回型別為空的委託.

2. 可以給control定義乙個invoke的擴充套件方法

複製** **如下:

public static void invoke(this control control, action action)

呼叫的時候則可以這樣呼叫:

複製** **如下:

//使用委託

xxcontrol.invoke(delegate );

//使用lambda表示式

xxcontrol.invoke(()=>);

本文標題: c#匿名方法與delegate型別轉換錯誤分析

本文位址: /ruanjian/csharp/116299.html

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

問題描述 c 2.0出現了匿名方法,這在一定程度上節省了我們維護 上下文的精力,也不需要思考為某個方法取什麼名字比較合適.在fcl的一些方法中要求傳入乙個delegate型別的引數,比如control.invoke或者control.begininvoke方法 0 public object inv...

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

c 2.0出現了匿名方法,這在一定程度上節省了我們維護 上下文的精力,也不需要思考為某個方法取什麼名字比較合適.在fcl的一些方法中要求傳入乙個delegate型別的引數,比如control.invoke或者control.begininvoke方法 public object invoke del...

匿名類與擴充套件方法

var可以根據變數的初始值自動推斷區域性變數的型別 var只能定影區域性變數,而不能定義成員變數 定義的時候必須同時完成初始化,而不能使用var定義變數為null var本身並不是一種新的型別,只是用來修飾乙個可推斷出具體型別的區域性變數 var定義變數和object型別定義的區別 console....