base.Invoke с делегатами - PullRequest
       0

base.Invoke с делегатами

4 голосов
/ 13 октября 2010

Я вызываю делегата, и я не очень информирован о том, как он работает, и из-за этого у меня возникают ошибки компиляции (Ошибка компилятора CS1660). Вот код, который у меня есть для этого:

 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;
        });

Ответы [ 2 ]

6 голосов
/ 13 октября 2010

добавить (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 methodDelegate: преобразование не существует
  • Anonymous methodAction: неявное преобразование, если подпись соответствует
  • ActionDelegate: неявное преобразование (Action является потомком Delegate)

Объедините их:

  • Anonymous methodActionDelegate: это работает!
2 голосов
/ 13 октября 2010

Попробуйте это:

// 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 может оказаться полезной, хотя в ней не упоминается, почему компилятор C # не считает System.Delegate типом делегата, что является настоящей проблемой здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...