有关虚拟方法和事件命名的VS2015警告(如果要隐藏,请使用新关键字)

时间:2016-10-04 14:25:08

标签: c# visual-studio visual-studio-2015

嗨,全部

我有一些代码如下所示:

public class Child : Parent
{
    public event Action<string> OnEventTriggered;
}

public class Parent
{
    protected virtual void OnEventTriggered( double x ) { }
}

编译器显示警告消息:

&#39; Child.OnEventTriggered&#39;隐藏继承的成员&#39; Parent.OnEventTriggered(double)&#39;。如果要隐藏,请使用new关键字。

虚拟方法与事件名称共享同名。

虚方法的Param类型是double,Action是字符串类型。

为什么违反了检查规则?

感谢您提前回答。

其他方案:

如果我将代码更改为此代码,则不会显示任何警告。

这些代码之间的区别是什么?

public class Child : Parent
{
    public void OnEventTriggered( string x ) { }
}

public class Parent
{
    protected virtual void OnEventTriggered( double x ) { }
}

1 个答案:

答案 0 :(得分:2)

因为名称相同。由于您未添加任何覆盖关键字,因此编译器假定您不了解基类属性/方法,并向您发出警告。

  • 如果要覆盖基类属性/方法,请使用覆盖。为此,类型和名称必须匹配。可以从基类调用此属性/方法。
  • 如果要创建全新的属性/方法,请使用 new 。无法从基类调用此新属性/方法。

更改派生类中事件的名称,不会违反规则。

通常情况下,事件以下列方式实现,所有事件都在同一个类中:

public class EventDemo {
    public event EventHandler SomeEvent;

    protected virtual void OnSomeEvent() {
        var someEvent = SomeEvent;
        if (someEvent != null) {
            someEvent(this, EventArgs.Empty);
        }
    }
}