C#匿名辦法與Delegate類型轉換毛病剖析。本站提示廣大學習愛好者:(C#匿名辦法與Delegate類型轉換毛病剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C#匿名辦法與Delegate類型轉換毛病剖析正文
本文實例剖析了C#匿名辦法與Delegate類型轉換毛病。分享給年夜家供年夜家參考。詳細剖析以下:
成績描寫
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()
{
XXControl.Invoke(new DoSomething(() =>
{
//DoSomething的詳細操作
}));
}
如許做可所以可以, 但應用匿名辦法則更好, 最最少看上去更簡練.
private void App()
{
XXControl.Invoke(delegate
{
//DoSomething的詳細操作
});
}
下面的代碼會在編譯的時刻失足: Cannot convert anonymous method to type System.Delegate because it is not a delegate type. 辦法請求參數的是一個拜托(delegate)類型, 而如今傳遞的只是一個匿名辦法. 發生這個毛病最基本的緣由是編譯器在處置匿名辦法的時刻, 沒法揣摸出這個拜托的辦法前往的是甚麼類型, 也就不曉得前往一個甚麼樣的拜托.
處理辦法
要處理下面這個成績, 從基本下去說就是指定這個匿名辦法將會前往甚麼類型的拜托, 有幾種辦法:
1. 應用MethodInvoke或許Action
private void App()
{
XXControl.Invoke((MethodInvoker)delegate()
{
//DoSomething的詳細操作
});
}
private void App()
{
XXControl.Invoke((Action)delegate()
{
//DoSomething的詳細操作
});
}
MethodInvoke和Action都是辦法前往類型為空的拜托.
2. 可以給Control界說一個Invoke的擴大辦法
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
挪用的時刻則可以如許挪用:
//應用拜托
XXControl.Invoke(delegate { //DoSomething here});
//應用lambda表達式
XXControl.Invoke(()=>{ //DoSomething here});
願望本文所述對年夜家的C#法式設計有所贊助。