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;
});
add (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;
});
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 existsAnonymous method
→ Action
: implicit conversion if signature matchesAction
→ Delegate
: implicit conversion (Action
is descendant of Delegate
)Combine them:
Anonymous method
→ Action
→ Delegate
: it works!Try this:
// 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);
You have to tell the complier a specific delegate-type to use; there could be any number of delegate-types that are compatible with an anonymous method.
You might find this MSDN page helpful, although it doesn't mention why the C# compiler doesn't consider System.Delegate
to be a delegate-type, which is the real problem here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With