当前位置: 首页 > 编程语言 > C#

为什么要忽略基类中声明的签名?分享

时间:2023-04-10 21:50:57 C#

为什么在基类中声明的签名会被忽略?classBase{publicvirtualvoidMethodA(intx){Console.WriteLine("InBaseClass");}}classDerived:Base{publicoverridevoidMethodA(intx){Console.WriteLine("InderivedINT)");}publicvoidMethodA(objecto){Console.WriteLine("InderivedOBJECT");}}classTest{staticvoidMain(){Derivedd=newDerived();诠释k=20;d.MethodA(k);我得到的输出是“InderivedOBJECT”。这种奇怪行为的原因是什么?经过一番研究,我发现原因是基类中声明的签名被忽略了。为什么他们被忽视了?这是有充分理由的设计。这种设计有助于防止脆弱的基类问题。C#旨在使编写“版本化”组件变得更容易和更安全,这条规则是其中的重要组成部分。这是一个很常见的问题。这是我们收到的最常见的“错误报告”之一;也就是说,有人认为他们在编译器中发现了一个错误,而实际上他们已经找到了一个功能。有关功能及其设计原因的解释,请参阅我关于该主题的文章:http://blogs.msdn.com/b/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx有关各种语言如何处理脆弱基类问题的更多文章,请参阅我关于该主题的文章存档:http://blogs.msdn.com/b/ericlippert/archive/tags/brittle+base+/VC#2008中的类编译器在决定调用什么时先检查可用的非虚函数再虚函数。由于Derived类有一个非虚方法(对象)可以被调用,编译器调用它。如果将虚拟MethodA(object)添加到Base,Derived.MethodA(int)将被调用,因为MethodA(object)和MethodA(int)都是虚拟的。我不太熟悉C#语言规范,不知道这是指定行为还是编译器中的错误。以上是C#学习教程:为什么忽略基类声明的签名?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: