编译器警告CS0067:从不使用该事件

时间:2015-04-13 01:48:27

标签: c# events

我有一个我正在使用的活动,所以我真的不明白这个警告的真正含义。有人可以澄清吗?

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

在我的其他课程中,我注册并取消注册该活动:

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

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

2 个答案:

答案 0 :(得分:10)

由于类Actor<T>是抽象的,并且Actor<T>中没有代码引发事件,因此可以将事件抽象为:

public abstract event Action Dead;

然后在继承自Actor<T>的子类中,覆盖事件:

public override event Action Dead;

如果子类实际上没有引发事件,那么您可以通过为事件提供空addremove方法来抑制警告(请参阅this blog post)。

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

答案 1 :(得分:1)

真正的问题是我使用的是Unity和Mono 2.6,它仍然是一个bug。因此,我试图使用Blorgbeard所说的建议;它适用于Visual Studio,但不适用于编译器。

因此有两种解决方案在事件周围抛出#pragma warning disable,或传递泛型类型。

像这样:

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