欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#匿名方法與Delegate類型轉(zhuǎn)換錯誤分析

 更新時間:2014年11月22日 10:11:18   投稿:shichen2014  
這篇文章主要介紹了C#匿名方法與Delegate類型轉(zhuǎn)換錯誤,較為詳細的分析了C#匿名方法的用法及Delegate類型轉(zhuǎn)換錯誤問題解決方法,具有一定的實用價值,需要的朋友可以參考下

本文實例分析了C#匿名方法與Delegate類型轉(zhuǎn)換錯誤。分享給大家供大家參考。具體分析如下:

問題描述 

C#2.0出現(xiàn)了匿名方法, 這在一定程度上節(jié)省了我們維護代碼上下文的精力, 也不需要思考為某個方法取什么名字比較合適. 在FCL的一些方法中要求傳入一個Delegate類型的參數(shù), 比如Control.Invoke或者Control.BeginInvoke方法:

復制代碼 代碼如下:
public object Invoke(Delegate method);

public IAsyncResult BeginInvoke(Delegate method);

在這種情況下, 如果不使用匿名方法, 則需要在代碼的上面先聲明一個delegate void DoSomething()方法, 然后可以在Invoke方法中再用lambda表達式或者委托實現(xiàn)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. 方法要求參數(shù)的是一個委托(delegate)類型, 而現(xiàn)在傳遞的只是一個匿名方法. 產(chǎn)生這個錯誤最根本的原因是編譯器在處理匿名方法的時候, 沒法推斷出這個委托的方法返回的是什么類型, 也就不知道返回一個什么樣的委托.

解決方法

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

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);
}

調(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)常見檢測(斑點檢測,輪廓檢測,邊緣檢測)

    這篇文章主要為大家詳細介紹了c#如何使用OpenCvSharp實現(xiàn)常見檢測(斑點檢測,輪廓檢測,邊緣檢測),文中的示例代碼講解詳細,需要的小伙伴可以參考下
    2023-12-12
  • C#中Timer定時器類的簡單使用

    C#中Timer定時器類的簡單使用

    定時器就是經(jīng)過固定時間,執(zhí)行固定任務,本文主要介紹了C#中Timer定時器類的簡單使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C#簡單郵件群發(fā)通用類

    C#簡單郵件群發(fā)通用類

    這篇文章主要為大家分享了簡單的C#郵件群發(fā)通用類,代碼簡單實用,感興趣的小伙伴們可以參考一下
    2016-03-03
  • C#無限參數(shù)的寫法

    C#無限參數(shù)的寫法

    這篇文章主要介紹了C#無限參數(shù)的寫法,通過循環(huán)遍歷再結(jié)合paras.Add方法實現(xiàn)無限參數(shù)的功能,是比較實用的技巧,需要的朋友可以參考下
    2014-12-12
  • 輕松學習C#的讀寫操作

    輕松學習C#的讀寫操作

    輕松學習C#的讀寫操作,小編也是第一次接觸C#的讀寫操作,感興趣的小伙伴們可以參考一下,大家一起學習
    2015-11-11
  • c#:CTS類型系統(tǒng)

    c#:CTS類型系統(tǒng)

    CTS通用類型系統(tǒng),是.Net中一套定義類型的規(guī)則。我們要掌握c#開發(fā),首先要建立這個類型概念,只有知道c#的元素是什么類型,才能進行相關(guān)的分析和選材。
    2012-12-12
  • 解析abstract與override究竟可不可以同時使用

    解析abstract與override究竟可不可以同時使用

    本篇文章是對abstract與override究竟可不可以同時使用進行了詳細分析介紹,需要的朋友參考下
    2013-05-05
  • C#編寫Windows服務程序詳細步驟詳解(圖文)

    C#編寫Windows服務程序詳細步驟詳解(圖文)

    本文介紹了如何用C#創(chuàng)建、安裝、啟動、監(jiān)控、卸載簡單的Windows Service 的內(nèi)容步驟和注意事項,需要的朋友可以參考下
    2017-09-09
  • C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二

    C#數(shù)據(jù)結(jié)構(gòu)與算法揭秘二

    上文對數(shù)據(jù)結(jié)構(gòu)與算法,有了一個簡單的概述與介紹,這篇文章,我們介紹一中典型數(shù)據(jù)結(jié)構(gòu)——線性結(jié)構(gòu)
    2012-10-10
  • C#實現(xiàn)文本轉(zhuǎn)語音功能

    C#實現(xiàn)文本轉(zhuǎn)語音功能

    這篇文章主要為大家詳細介紹了C#實現(xiàn)文本轉(zhuǎn)語音功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論