时间:2021-05-20
本文实例分析了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#程序设计有所帮助。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例分析了C#中is与as的区别,分享给大家供大家参考。具体分析如下:一、C#类型的转换在c#中类型的转换分两种:显式和隐式,基本的规则如下:1、基类对象转
本文实例讲述了C#中委托用法。分享给大家供大家参考。具体分析如下:Delegate委托,在.NET中应用的非常广泛。会涉及到Lambda表达式,事件,匿名方法等
本文实例讲述了C#使用委托(delegate)实现在两个form之间传递数据的方法。分享给大家供大家参考。具体分析如下:关于Delegate【代理、委托】是C#
C#中的委托(Delegate)类似于C或C++中函数的指针。委托(Delegate)是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(De
前言:C#中的委托(Delegate)类似于C或C++中函数的指针。委托是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)