2010-10-13 185 views
4

我正在调用一个委托,我不是很了解它是如何工作的,我因为它编译错误(编译器错误CS1660)。这是我有它的代码:base.Invoke与代表

base.Invoke(delegate { 
      bool flag = (((this.layerPickPlaceProcess != null) && (this.robotComponent != null)) && ((((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Idle) || (((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Ready))) && ((((StateEnum) this.robotComponent.State) == StateEnum.Idle) || (((StateEnum) this.robotComponent.State) == StateEnum.Ready)); 
      this.cmdManualPlace.Enabled = flag; 
     }); 
+0

反射器是一个工具,将显示反编译程序集 - 该技术称为**反射**。 – Oded 2010-10-13 17:58:43

+0

我熟悉反射器,只是不与代表和反射也许没有正确地吐出代码? – mookie 2010-10-13 18:03:05

回答

6

添加(Action)

base.Invoke((Action)delegate { 
      bool flag = (((this.layerPickPlaceProcess != null) && (this.robotComponent != null)) && ((((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Idle) || (((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Ready))) && ((((StateEnum) this.robotComponent.State) == StateEnum.Idle) || (((StateEnum) this.robotComponent.State) == StateEnum.Ready)); 
      this.cmdManualPlace.Enabled = flag; 
     }); 

这是因为调用接受Delegate这不是委托据类型作为C#编译器是关心(原文如此!) 。委托类型应该定义一个呼叫签名,而Delegate不是,它只是一个共同的祖先。表达式delegate { ... }有类型...尝试猜... 匿名代理(如果它是一种方法,它将是方法组)。他们也不是委托类型!但它们可以隐式转换为具有匹配签名的委托类型。代表类型可以隐式转换为Delegate

Action是:public delegate void Action();

简单地说,链:

  • Anonymous methodDelegate:如果签名匹配
  • ActionDelegate隐式转换:转换不存在
  • Anonymous methodAction隐式转换(Action是01的后裔)

它们合并:

  • Anonymous methodActionDelegate:它的作品!
+0

我需要Action <>的至少一个参数。我敢尝试行动? – mookie 2010-10-13 18:02:30

+0

@mookie有委托类型'Action'没有参数 – Andrey 2010-10-13 18:05:20

+0

目前为止还没有回答。 – Timwi 2010-10-13 18:15:00

2

试试这个:

// MethodInvoker is also acceptable. 
Action action = delegate 
     { 
      bool flag = (((this.layerPickPlaceProcess != null) && (this.robotComponent != null)) && ((((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Idle) || (((StateEnum) this.layerPickPlaceProcess.State) == StateEnum.Ready))) && ((((StateEnum) this.robotComponent.State) == StateEnum.Idle) || (((StateEnum) this.robotComponent.State) == StateEnum.Ready)); 
      this.cmdManualPlace.Enabled = flag; 
     }; 

base.Invoke(action); 

你必须告诉编译器一个特定委托型使用;可能有任何数量的委托类型与匿名方法兼容。

您可能会发现这MSDN page有帮助,虽然它没有提到为什么C#编译器不认为System.Delegate是委托类型,这是真正的问题。

+0

没有错,但很高兴提到两种语法之一,它们允许在没有临时变量的情况下将其写入一个语句中。 – Timwi 2010-10-13 18:14:20