C#匿名方法與Delegate類型轉(zhuǎn)換錯誤分析
本文實例分析了C#匿名方法與Delegate類型轉(zhuǎn)換錯誤。分享給大家供大家參考。具體分析如下:
問題描述
C#2.0出現(xiàn)了匿名方法, 這在一定程度上節(jié)省了我們維護代碼上下文的精力, 也不需要思考為某個方法取什么名字比較合適. 在FCL的一些方法中要求傳入一個Delegate類型的參數(shù), 比如Control.Invoke或者Control.BeginInvoke方法:
public IAsyncResult BeginInvoke(Delegate method);
在這種情況下, 如果不使用匿名方法, 則需要在代碼的上面先聲明一個delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表達式或者委托實現(xiàn)DoSomething().
private void App()
{
XXControl.Invoke(new DoSomething(() =>
{
//DoSomething的具體操作
}));
}
這樣做可以是可以, 但使用匿名方法則更好, 最起碼看上去更簡潔.
{
XXControl.Invoke(delegate
{
//DoSomething的具體操作
});
}
上面的代碼會在編譯的時候出錯: Cannot convert anonymous method to type System.Delegate because it is not a delegate type. 方法要求參數(shù)的是一個委托(delegate)類型, 而現(xiàn)在傳遞的只是一個匿名方法. 產(chǎn)生這個錯誤最根本的原因是編譯器在處理匿名方法的時候, 沒法推斷出這個委托的方法返回的是什么類型, 也就不知道返回一個什么樣的委托.
解決方法
要解決上面這個問題, 從根本上來說就是指定這個匿名方法將會返回什么類型的委托, 有幾種方法:
1. 使用MethodInvoke或者Action
{
XXControl.Invoke((MethodInvoker)delegate()
{
//DoSomething的具體操作
});
}
private void App()
{
XXControl.Invoke((Action)delegate()
{
//DoSomething的具體操作
});
}
MethodInvoke和Action都是方法返回類型為空的委托.
2. 可以給Control定義一個Invoke的擴展方法
{
control.Invoke((Delegate)action);
}
調(diào)用的時候則可以這樣調(diào)用:
XXControl.Invoke(delegate { //DoSomething here});
//使用lambda表達式
XXControl.Invoke(()=>{ //DoSomething here});
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
c# OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)
這篇文章主要為大家詳細介紹了c#如何使用OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測),文中的示例代碼講解詳細,需要的小伙伴可以參考下2023-12-12C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二
上文對數(shù)據(jù)結(jié)構(gòu)與算法,有了一個簡單的概述與介紹,這篇文章,我們介紹一中典型數(shù)據(jù)結(jié)構(gòu)——線性結(jié)構(gòu)2012-10-10