“如果打算隐藏则使用新关键字”警告


101

屏幕底部有一个警告:

警告1'WindowsFormsApplication2.EventControlDataSet.Events'隐藏继承的成员'System.ComponentModel.MarshalByValueComponent.Events'。如果要隐藏,请使用new关键字。C:\ Users \ myComputer \ Desktop \ Event Control \ WindowsFormsApplication2 \ EventControlDataSet.Designer.cs 112 32 eventControl

如果我双击它,它会显示:

public EventsDataTable Events {
    get {
        return this.tableEvents;
    }

谁能告诉我如何摆脱这种情况?

Answers:


144

您的类有一个基类,并且此基类还具有一个称为Event的属性(不是虚拟的或抽象的),该属性已被您的类覆盖。如果您打算覆盖它,则将“ new”关键字放在public修饰符之后。例如

public new EventsDataTable Events
{
  ..
}

如果您不想覆盖它,请将您的属性名称更改为其他名称。


23
这是任何想知道new和override之间的区别的的链接
starplusplus

new 关键字将摆脱编译错误的,但可能会引入其他意外情况。我认为您应该在回答中添加警告。这将有助于理解添加的后果new
ahong

13

@wdavo是正确的。函数也是如此。

如果您覆盖基本函数(如Update),则在子类中需要:

new void Update()
{
  //do stufff
}

如果函数删除开始时没有新的代码,您将得到警告标志。


6

在下面的代码中,Class A实现接口IShow并实现其method ShowDataClass B继承Class A。为了在中使用ShowDatamethod Class B,我们必须newShowData方法中使用关键字来隐藏基类Class A方法,并使用override关键字来扩展方法。

interface IShow
{
    protected void ShowData();
}

class A : IShow
{
    protected void ShowData()
    {
        Console.WriteLine("This is Class A");
    }
}

class B : A
{
    protected new void ShowData()
    {
        Console.WriteLine("This is Class B");
    }
}

3
override您的示例中没有任何说明,override因此不需要。
Etienne Faucher's

我认为您的示例在正确的轨道上,但是还不完整。您的解释也不清楚。您可以将答案编辑为更像dotnetfiddle.net/Iw0OzB吗?如果没有,我可能会把小提琴作为另一个答案
ahong

0

父函数需要virtual关键字,子函数需要override在函数定义之前的关键字。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.