我理解使用参数调用基本方法将默认为没有任何默认参数的方法。大!完全可以理解!
Resolving Ambiguities with Optional Parameters and Named Arguments
但是,请考虑这种情况
using System;
class Class1 {
public virtual string method1( string test ) {
return test;
}
}
class Class2 : Class1 {
// Method is hidden!
public override string method1( string test ) {
return test;
}
public virtual string method1( string test, string test2 = " - this shouldn't be called" ) {
return test + test2;
}
}
class Class3 : Class2 {
static int Main( string[] args ) {
var c = new Class3();
string theString;
theString = c.test1();
System.Console.WriteLine( theString ); // "Test - this shouldn't be called"
theString = c.test2( );
System.Console.WriteLine( theString ); // "Test"
return 0;
}
public string test1() {
return base.method1( "test" ); // calls base.method1( string, string )
}
public string test2() {
return ( ( Func<string, string> )base.method1)("test"); // calls base.method1( string )
}
}
显然,调用基本方法的预期行为应该只打印出“Test”,但它不会打印,而是使用默认参数调用该方法。我还是IL的新手,但它也表明它明确地解析了默认参数的方法。
这基本上隐藏了子类中的方法签名方法(字符串)。
这到底发生了什么?
这是C#中的错误吗?编译器中的错误?
在支持的生成链中,方法调用是否更高,具有优先权 在他们的孩子的覆盖电话?
我有什么遗失的吗?
对于好奇,通过使用委托函数
解决了问题( ( Func<string, string> )base.method)("Test"); // prints out "Test"
**编辑 - 如果复制粘贴
,代码现在编译