2015-04-13 14 views
5

Ho un evento che sto utilizzando, quindi non capisco cosa significhi realmente questo avvertimento. Qualcuno può chiarire?Avviso compilatore CS0067: l'evento non viene mai utilizzato

public abstract class Actor<T> : Visual<T> where T : ActorDescription 
{ 
    #region Events 
    /// <summary> 
    /// Event occurs when the actor is dead 
    /// </summary> 
    public event Action Dead; 
    #endregion 

/// <summary> 
    /// Take damage if the actor hasn't taken damage within a time limit 
    /// </summary> 
    /// <param name="damage">amount of damage</param> 
    public void TakeDamage(int damage) 
    { 
     if (damage > 0 && Time.time > m_LastHitTimer + m_DamageHitDelay) 
     { 
      m_CurrentHealth -= damage; 

      if (m_CurrentHealth <= 0) 
      { 
       m_CurrentHealth = 0; 

       if (Dead != null) 
        Dead(); 
      } 
      else 
       StartCoroutine(TakeDamageOnSprite()); 

      m_LastHitTimer = Time.time; 
     } 
    } 

Nella mia altra classe, mi registro e annullare la registrazione per l'evento:

 if (m_Player != null) 
      m_Player.Dead += OnPlayerDead; 

     if (m_Player != null) 
      m_Player.Dead -= OnPlayerDead; 

risposta

9

Poiché la classe Actor<T> è astratta, e nessun codice all'interno Actor<T> genera l'evento, è possibile effettuare l'abstract dell'evento:

public abstract event Action Dead; 

Poi nella sottoclasse (es), che eredita da Actor<T>, si ignora l'evento:

012.
public override event Action Dead; 

Se una sottoclasse in realtà non generare l'evento, allora si può eliminare l'avviso, dando l'evento vuoto add e remove metodi (vedi this blog post).

public override event Action Dead 
{ 
    add { } 
    remove { } 
} 
+0

Ohhhh. Questo ha perfettamente senso !! Grazie! –

1

Il vero problema è che sto usando Unity e Mono 2.6 ed è ancora un bug. Pertanto, ho tentato di usare il suggerimento che Blorgbeard ha detto, comunque; ha funzionato per Visual Studio ma non per il compilatore.

Quindi ci sono due soluzioni che disabilitano la disabilitazione di avviso #pragma attorno all'evento o che passano il tipo generico.

in questo modo:

public abstract class Actor<T> : Visual<T> where T : ActorDescription 
{ 
    #region Events 
    /// <summary> 
    /// Event occurs when the actor is dead 
    /// </summary> 
    public event Action<Actor<T>> Dead; 
    #endregion 

    ... 

    private void SomeFunc() 
    { 
     if (Dead != null) 
      Dead(); 
    } 
}