程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#匿名辦法與Delegate類型轉換毛病剖析

C#匿名辦法與Delegate類型轉換毛病剖析

編輯:C#入門知識

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#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved