我有一个带有以下抽象事件的抽象基类
public abstract class SignalWrapperBase<T> : IReadOnlySignal<T> {
public abstract event Action<IReadOnlySignal<T>, Sample<T>> Updated;
...
}
在我的实现中,我只是说
public class ValueChangedSignal : SignalWrapperBase<T> {
public override event Action<IReadOnlySignal<T>, Sample<T>> Updated;
...
}
当我在实现中ValueChangedSignal
尝试执行以下操作时
if (Updated != null) { Updated(this, sample); }
我收到 ReSharper 警告:Invocation of polymorphic field-like event。
我检查了它背后的原因,但它virtual
没有abstract
在示例中使用:
public class Base
{
public virtual event EventHandler MyEvent;
}
public class Derived : Base
{
public override event EventHandler MyEvent;
public void SomeMethod()
{
var args = ...;
MyEvent(this, args);
}
}
上面的代码块使用覆盖事件声明来覆盖事件上添加和删除方法的实现。然后,该字段本身将存在于两个单独的实例中 - 一个在 Base 中,一个在 Derived 中。因此,在使用 Derived 时,您可能永远不会实例化 Base 的 MyEvent,除非您明确将其设置为某个值。并且,因此,在基类中引发事件的情况下的行为将与派生类中的行为不同。
我知道如果是的话,我会得到两个实例virtual
。我会用实际实现隐藏基本实现,但是,当我使用时,abstract
我从不做基本实现,是吗?我认为当我在某个字段上使用抽象时,我只是将实现转发给继承类,即我要求我的基类的用户实现抽象代码。
ReSharper 是否给了我错误的警告?还是我误解了什么?