Hey*_*007 5 .net c# overriding overloading optional-parameters
今天我写了一个小程序来理解C#的Optional Parameters的基本原理.
以下是该计划:
abstract class AbstractClass
{
internal abstract void Test();
}
sealed class DerivedClass : AbstractClass
{
internal override void Test()
{
Console.WriteLine("In override DerivedClass.Test() method");
}
internal void Test(int a = 1)
{
Console.WriteLine("In DerivedClass.Test(int a=1) method " + a);
}
internal void Test(int b, int a = 1)
{
Console.WriteLine("In DerivedClass.Test(int b, int a=1) method " + string.Format("{0} {1}", b, a));
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我所谓的Test()方法:
DerivedClass d = new DerivedClass();
d.Test();
d.Test(6);
d.Test(b:7);
Run Code Online (Sandbox Code Playgroud)
输出:
在DerivedClass.Test(int a = 1)方法1中
在DerivedClass.Test(int a = 1)方法6中
在DerivedClass.Test(int b,int a = 1)方法7 1
关于d.Test();:我的理解是,它将Test()作为带有可选参数的方法处理,并将Test(int a = 1)使用此输出调用:
在DerivedClass.Test(int a = 1)方法1中
但这是执行时让我感到困惑的d.Test(6);原因:为什么这个方法调用没有给出输出:
在DerivedClass.Test(int b,int a = 1)方法6 1
根据我的理解,"6"是必需参数,它应该调用
internal void Test(int b, int a = 1)
Run Code Online (Sandbox Code Playgroud)
请解释一下我的理解有什么问题.
另外如何调用overriden方法?
internal override void Test()
Run Code Online (Sandbox Code Playgroud)
规则匹配最适合internal void Test(int a = 1)您的代码d.Test(6);:它匹配参数的数量,类型.这使得该方法成为最佳匹配.
调用时d.Test(b:7);,强制它作为最后一个方法运行,因为您匹配参数的名称.这使得最后一种方法成为最佳匹配.
第一个(d.Test();)与您期望的方法()不匹配void Test(),因为'自己'方法比派生方法更受欢迎.尝试删除基类或new在方法上使用运算符,您将看到.
关于可选参数的规则可能有点令人困惑,但要记住的一个简单的经验法则是,它总是会优先使用参数较少的方法,而不是参数较多的方法。
因此对于
d.Test(6);
Run Code Online (Sandbox Code Playgroud)
只有一个参数的方法:
internal void Test(int a = 1)
Run Code Online (Sandbox Code Playgroud)
将被使用,即使它是一个可选参数。
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |