在构造函数中传递默认值

时间:2014-11-03 21:24:02

标签: c# constructor overloading

我有一个课程执行,以下是该课程的代码。

public class Executive
{
    public Executive(int ID=0)
    {
        //constructor 1
        this.BaseSalary = 3000;
        Console.Write("DONE");
    }

    public Executive()
    {
        //constructor 2
        Console.Write("done");
    }
}

我主要做以下事情:

Executive exec = new Executive()

它总是调用constructor2。为什么不调用Constructor1(ID有一个默认值)?

2 个答案:

答案 0 :(得分:3)

确定调用最佳方法的方法。执行重载解析时,将从参数列表中删除没有指定值的可选参数:

  

7.5.3.2更好的职能成员

     

为了确定更好的函数成员,构造了一个精简的参数列表A,它只包含它们在原始参数列表中出现的顺序的参数表达式。每个候选函数成员的参数列表按以下方式构造:

     

•如果功能成员仅适用于扩展形式,则使用扩展形式。

     

从参数列表中删除没有相应参数的可选参数

     

•重新排序参数,使它们出现在与参数列表中相应参数相同的位置。

同一段后面也是:

  

如果参数类型序列{P1, P2, …, PN}{Q1, Q2, …, QN}是等效的(即每个Pi都具有到相应Qi的标识转换),则以下打破平局规则按顺序应用,以确定更好的功能成员。

     

•如果MP是非通用方法且MQ是通用方法,则MP优于MQ

     

•否则,如果MP适用于其正常格式且MQ具有params数组且仅适用于其展开形式,则MP优于MQ

     

•否则,如果MP声明的参数多于MQ,则MP优于MQ。如果两种方法都具有params数组且仅适用于其扩展形式,则会发生这种情况。

     

否则,如果MP的所有参数都有相应的参数,而默认参数需要替换MQ中的至少一个可选参数,那么MP优于MQ

这意味着如果你有两种方法都有适用的参数但一种方法需要使用可选参数值而另一种方法不需要,那么没有可选值的方法就更好了。

答案 1 :(得分:2)

正如MarcinJuraszek指出的那样,这就是它如何确定应该调用哪个构造函数。当你调用无参数构造函数时,那个被确定为最合适的构造函数。

解决问题的方法是从另一个显式调用一个构造函数:

 public class Executive
 {
    public Executive(int ID)
    {
        //constructor 1
        this.BaseSalary = 3000;
        Console.Write("DONE");
    }

    public Executive():this(0)
    {
        //constructor 2
        Console.Write("done");
    }
}