我有一个我正在使用的活动,所以我真的不明白这个警告的真正含义。有人可以澄清吗?
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;
答案 0 :(得分:10)
由于类Actor<T>
是抽象的,并且Actor<T>
中没有代码引发事件,因此可以将事件抽象为:
public abstract event Action Dead;
然后在继承自Actor<T>
的子类中,覆盖事件:
public override event Action Dead;
如果子类实际上没有引发事件,那么您可以通过为事件提供空add
和remove
方法来抑制警告(请参阅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();
}
}