добавить (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;
});
это потому, что Invoke принимает Delegate
, который не является (sic!) Типом делегата для компилятора C #. Тип делегата должен определять сигнатуру вызова, в то время как Delegate
не определяет и является просто общим предком. Выражение delegate { ... }
имеет тип ... попытаться угадать ... анонимный делегат (если бы это был метод, он был бы группа методов ). Они также не являются делегатами! Но они могут быть неявно преобразованы в тип делегата с соответствующей подписью. И типы делегатов могут быть неявно преобразованы в Delegate
.
Action
: public delegate void Action();
просто, цепочки:
Anonymous method
→ Delegate
: преобразование не существует
Anonymous method
→ Action
: неявное преобразование, если подпись соответствует
Action
→ Delegate
: неявное преобразование (Action
является потомком Delegate
)
Объедините их:
Anonymous method
→ Action
→ Delegate
: это работает!