C#匿名方法与Delegate类型转换错误分析

 更新时间:2014年11月22日 10:11:18   投稿:shichen2014  
这篇文章主要介绍了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#程序设计有所帮助。

相关文章

  • C#使用linq对数组进行筛选排序的方法

    C#使用linq对数组进行筛选排序的方法

    这篇文章主要介绍了C#使用linq对数组进行筛选排序的方法,实例分析了C#实用linq扩展进行数组排序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 在WPF中使用Interaction.Triggers

    在WPF中使用Interaction.Triggers

    这篇文章介绍了在WPF中使用Interaction.Triggers的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • c#中WebService的介绍及调用方式小结

    c#中WebService的介绍及调用方式小结

    这篇文章主要给大家介绍了关于c#中的WebService及其调用方式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • C#实现两个时间相减的方法

    C#实现两个时间相减的方法

    这篇文章主要介绍了C#实现两个时间相减的方法,实例分析了C#针对时间操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C# TextBox多行文本框的字数限制问题

    C# TextBox多行文本框的字数限制问题

    最近在使用C# TextBox多行文本框的时候,发现了其对字数限制的一点问题,所以总结下在使用C# TextBox多行文本框要注意的的字数限制问题,现在分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • C# WPF上位机实现和下位机TCP通讯的方法

    C# WPF上位机实现和下位机TCP通讯的方法

    这篇文章主要介绍了C# WPF上位机实现和下位机TCP通讯的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • C#实现把指定数据写入串口

    C#实现把指定数据写入串口

    这篇文章主要介绍了C#实现把指定数据写入串口,直接给出示例代码,需要的朋友可以参考下
    2015-06-06
  • C#实现验证码功能

    C#实现验证码功能

    这篇文章主要为大家详细介绍了C#实现验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 在WinForm中发送HTTP请求的实现方法

    在WinForm中发送HTTP请求的实现方法

    下面小编就为大家带来一篇在WinForm中发送HTTP请求的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • C#异步编程由浅入深(二)之Async/Await的使用

    C#异步编程由浅入深(二)之Async/Await的使用

    这篇文章主要介绍了C#异步编程由浅入深(二)之Async/Await的作用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03

最新评论