无法理解带有Optional Parameter的方法的输出

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)

Pat*_*man 6

规则匹配最适合internal void Test(int a = 1)您的代码d.Test(6);:它匹配参数的数量,类型.这使得该方法成为最佳匹配.

调用时d.Test(b:7);,强制它作为最后一个方法运行,因为您匹配参数的名称.这使得最后一种方法成为最佳匹配.

第一个(d.Test();)与您期望的方法()不匹配void Test(),因为'自己'方法比派生方法更受欢迎.尝试删除基类或new在方法上使用运算符,您将看到.


Dav*_*rno 0

关于可选参数的规则可能有点令人困惑,但要记住的一个简单的经验法则是,它总是会优先使用参数较少的方法,而不是参数较多的方法。

因此对于

d.Test(6);
Run Code Online (Sandbox Code Playgroud)

只有一个参数的方法:

internal void Test(int a = 1)
Run Code Online (Sandbox Code Playgroud)

将被使用,即使它是一个可选参数。