2017-01-13 2 views
1

Привет, поэтому я пытаюсь изменить это событие, когда состояние обновлено по какой-то причине, это не позволяет мне скомпилировать его сообщение об ошибке:Событие может отображаться только в левой части + = или - = error

The event 'Entity.StateChanged' can only appear on the left hand side of += or -= 

Я не знаю, что это неправильно, это кажется правильным я пытался Google это не помогло

public Entity.State state 
{ 
    get 
    { 
     return this._state; 
    } 
    set 
    { 
     if (this._state != value) 
     { 
      this._state = value; 
      this.OnStateChanged(); 
     } 
    } 
} 

protected virtual void OnStateChanged() 
{ 
    if (this.StateChanged != null) 
    { 
     this.StateChanged(); 
    } 
} 

public event Action StateChanged 
{ 
    [MethodImpl(MethodImplOptions.Synchronized)] 
    add 
    { 
     this.StateChanged += value; 
    } 
    [MethodImpl(MethodImplOptions.Synchronized)] 
    remove 
    { 
     this.StateChanged -= value; 
    } 
} 

Спасибо парня за ваше время и помощь!

+1

Я не знаю о данной ошибке, но запись 'this.StateChanged + = value' в обработчике добавления' StateChanged' звучит как хороший способ получить переполнение стека – BradleyDotNET

+0

Почему вы добавляете пользовательский add/remove в первую очередь? – Servy

+0

Есть ли способ исправить проблему переполнения стека, Также я проверяю действие события, которое я так извиняю! – Reptic

ответ

4

Если один реализует custom events accessor, то он должен предоставить поле подкладочного делегат, который будет использоваться для хранения добавленных обратных вызовов:

protected virtual void OnStateChanged() 
{ 
    var stateChanged = this._stateChanged; 
    if (stateChanged == null) 
     return; 

    stateChanged(); 
} 

private Action _stateChanged; 

public event Action StateChanged 
{ 
    [MethodImpl(MethodImplOptions.Synchronized)] 
    add 
    { 
     this._stateChanged += value; 
    } 
    [MethodImpl(MethodImplOptions.Synchronized)] 
    remove 
    { 
     this._stateChanged -= value; 
    } 
} 

Но почему она работает со стандартным/не обычаем таких событий, как public event Action StateChanged;?

Поскольку компилятор автоматически создает поле подкладочный для этого события, и вы можете получить получить его с var action = this.StateChanged;, но вы должны знать, что events are not fields - они являются парой методов - add, remove. Это компилятор, который контекстно обращается к автогенерируемому событию ., когда вы делаете var action = this.StateChanged;.

+0

Благодарим вас за ответ и объяснение помогает много! – Reptic