无法理解可选参数

时间:2015-06-22 08:48:20

标签: c# .net overloading optional-parameters method-overriding

今天我正在编写一个小程序来了解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));
    }
}

这就是我调用Test()方法的方法:

   DerivedClass d = new DerivedClass();       
   d.Test();
   d.Test(6);
   d.Test(b:7);

输出

  

在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)

请解释我的理解有什么不妥。

还有如何调用overriden方法?

internal override void Test()

2 个答案:

答案 0 :(得分:6)

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

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

第一个(d.Test();)与您预期的方法(void Test())不匹配,因为'拥有'方法优于衍生方法。尝试删除基类或在方法上使用new运算符,您将看到。

答案 1 :(得分:0)

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

所以

d.Test(6);

只有一个参数的方法:

internal void Test(int a = 1)
即使它是可选参数,也会使用