2015-04-13 49 views
5

Ich habe ein Ereignis, das ich verwende, so dass ich nicht wirklich verstehe, was diese Warnung wirklich bedeutet. Kann jemand klären?Compiler Warnung CS0067: Das Ereignis wird nie verwendet

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

In meiner anderen Klasse, melde ich mich und für die Veranstaltung deregistrieren:

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

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

Antwort

9

Da die Klasse Actor<T> abstrakt ist und kein Code in Actor<T> stellt sich die Veranstaltung, können Sie das Ereignis abstrakt machen:

public abstract event Action Dead; 

Dann in Unterklasse (n), die von Actor<T> erben, außer Kraft setzen Sie das Ereignis:

public override event Action Dead; 

Wenn eine Unterklasse tatsächlich das Ereignis nicht erhöhen, dann können Sie die Warnung, indem das Ereignis leer add und remove Methoden (siehe this blog post) unterdrücken.

+0

Ohhhh. Das macht total Sinn !! Vielen Dank! –

1

Das eigentliche Problem ist, dass ich Unity und Mono 2.6 benutze und es immer noch ein Bug ist. Deshalb habe ich versucht, den Vorschlag zu verwenden, den Blorgbeard gesagt hat; Es funktionierte für Visual Studio, aber nicht für den Compiler.

Es gibt also zwei Lösungen, die #pragma warning disable um das Ereignis werfen oder den generischen Typ übergeben.

wie so:

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(); 
    } 
} 
Verwandte Themen