原文地址:
问题:
I am invoking a delegate and I'm not very informed about how it works and I have compilation errors because of it (Compiler Error CS1660). This is the code I have for it:
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; });
原因:
this is because Invoke accepts Delegate
which is not (sic!) a delegate type as far as the C# compiler is concerned. A delegate type should define a call signature, while Delegate
does not and is just a common ancestor. The expression delegate { ... }
has type... try to guess... anonymous delegate(if it was a method it would be method group). They are not delegate types either! But they can be implicitly converted to a delegate type that has a matching signature. And delegate types can be implicitly converted to Delegate
.
Action
is: public delegate void Action();
simply, chains:
-
Anonymous method
→Delegate
: no conversion exists -
Anonymous method
→Action
: implicit conversion if signature matches -
Action
→Delegate
: implicit conversion (Action
is descendant ofDelegate
)
Combine them:
-
Anonymous method
→Action
→Delegate
: it works!
// 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);