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

C#通过可选参数和多级继承共享选择了一个不同于预期的方法

时间:2023-04-10 20:10:01 C#

C#通过可选参数和多级继承选择了一个不同于预期的方法在给定的例子中(抱歉代码风格,它是为了紧凑self-containedrepro),被调用的方法总是B中的一个虚方法,它有额外的整数参数,而我希望C中的这个方法将是一个被调用的方法。使用System.Collections.Generic;使用System.Linq;使用系统文本;namespaceMethodChoosing{classProgram{staticvoidMain(string[]args){Cc=newC();厘米();安慰。读取密钥();}}publicclassA{publicvirtualvoidM(bool?a=null){Console.WriteLine("basebase");}}publicclassB:A{publicoverridevoidM(bool?a=null){Console.WriteLine("baseoverride");}publicvirtualvoidM(bool?a=null,int?b=null){Console.Write("basenew");}}publicclassC:B{publicoverridevoidM(bool?a=null){Console.WriteLine("pickme!");}}}输出“basenew”。这显然不是我预期的行为,谁能解释一下原因?编辑:将main更改为使cM具有true或null参数仍然会选择不正确的方法。规范的第7.4节指出,覆盖方法将被排除在成员查找期间考虑的可访问方法集中。考虑到原始问题中的方法,A类有一个非覆盖方法,B类有一个非覆盖方法,C类没有任何方法。从集合中的两个方法中,编译器选择最派生类中的匹配方法(在本例中为类B,“basenew”函数)。如果B类中的匹配函数不存在,则最佳函数匹配将是A类中的虚函数。在这种情况下,将使用作为虚拟对象的运行时类型来选择哪个重写函数将选择A、B或C类。陈述问题的时候,因为方法是在C类对象上调用的,所以会是一句“pickme!”功能。这就是所谓的模糊调用。由于您有两个方法,仅由一个可选参数分隔,因此应用程序似乎选择了可以满足最多参数的方法。编辑:正如@lazyberezovsky所说,我不太对劲。如果您有一个不满足任何参数的方法,最好使用cM(),假设调用M(null,null)。这就是可选参数的工作方式。如果要调用CM(null),请在CM(null)中调用CM(null)或覆盖M(bool?a=null,int?b=null)。以上就是C#学习教程的全部内容:C#通过可选参数和多级继承选择了一个不同于预期方法的方法。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: