C# 当存在一个不明确的虚方法时,为什么这个C代码编译得很好?

C# 当存在一个不明确的虚方法时,为什么这个C代码编译得很好?,c#,inheritance,methods,overriding,C#,Inheritance,Methods,Overriding,我有一个类(类B),它继承了另一个包含虚拟方法的类(类a) 在类B中声明(应该是)重写方法时,我错误地忽略了override关键字 A类 public class ClassA{ public virtual void TestMethod(){ } } B类 public class ClassB : ClassA{ public void TestMethod(){ } } 代码编译没有问题。有人能解释一下原因吗?B级应该是 public class Cl

我有一个类(类B),它继承了另一个包含虚拟方法的类(类a)

在类B中声明(应该是)重写方法时,我错误地忽略了
override
关键字

A类

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

public class ClassB : ClassA{
    public void TestMethod(){
    }
}
代码编译没有问题。有人能解释一下原因吗?

B级应该是

public class ClassB : ClassA{
    public override void TestMethod(){
    }
}
但是它可以在没有覆盖的情况下编译-它应该会生成一个警告,如果需要,您需要添加新的关键字

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

签出查看更多信息

这并不含糊。它应该编译时带有一个警告,说明您应该指定“new”或“override”,并且默认值实际上是“new”


当我试图编译代码时,它肯定会给出一个警告——当你说它编译“很好”和“没有问题”时,你是否忽略了警告?

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

是否打开了警告?警告已关闭-现在重新打开:)确实,我没有显示警告-为此,我将再次打开警告。
新的
方法在这种情况下有什么作用域?如果
override
基本上中止了旧方法,那么
new
必须为该方法创建一个访问级别?@Jimbo:我不确定您在这里真正使用的术语是什么——“中止”和“访问级别”在这里并不适用。但基本上,如果对编译时类型为
ClassA
的引用调用
TestMethod
,它将调用原始方法;如果使用编译时类型为
ClassB
的引用,它将使用派生类方法。