【问题标题】:Why does this C# code compile fine when there is an ambiguous virtual method?为什么当存在模棱两可的虚方法时,这段 C# 代码编译得很好?
【发布时间】:2011-02-24 14:26:36
【问题描述】:

我有一个类(B 类)继承了另一个包含虚方法的类(A 类)。

错误地,我在 B 类中声明(应该是)覆盖方法时省略了 override 关键字。

A 类

public class ClassA{
    public virtual void TestMethod(){
    }
}

B 类

public class ClassB : ClassA{
    public void TestMethod(){
    }
}

编译的代码没有问题。谁能解释一下为什么?

【问题讨论】:

  • 您是否开启了警告?
  • 警告已关闭 - 现在重新打开 :)

标签: c# inheritance methods overriding


【解决方案1】:

这不是模棱两可的。它应该在编译时发出警告,说明您应该指定“new”或“override”,并且默认值实际上是“new”。

当我尝试编译该代码时,它肯定会发出警告 - 当你说它编译“正常”和“没有问题”时,你是否忽略了警告?

【讨论】:

  • 确实有警告没有显示 - 谢谢你,我会再次发出警告。
  • 在这种情况下new 方法的作用域是什么?如果override 基本上中止了旧方法,那么new 必须为该方法创建一个访问级别?
  • @Jimbo:我不确定你在这里真正使用了什么术语——“中止”和“访问级别”在这里并不适用。但基本上,如果您在编译时类型为ClassA 的引用上调用TestMethod,它将调用原始方法,如果您使用编译时类型为ClassB 的引用,它将使用派生类方法。
【解决方案2】:

C# 编译器生成警告。我建议您始终使用“警告为错误”进行编译。

【讨论】:

    【解决方案3】:

    B类应该是

    public class ClassB : ClassA{
        public override void TestMethod(){
        }
    }
    

    但它可以在没有覆盖的情况下编译 - 它应该生成一个警告,如果它是有意的,你需要添加新的关键字

    public class ClassB : ClassA{
        public new void TestMethod(){
        }
    }
    

    结帐this了解更多信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多