C#:使用可选参数重载构造函数&命名参数?

时间:2012-02-24 04:21:37

标签: c# optional-parameters named-parameters

这不是关于正确编码实践的问题,我只是在研究语义。 假设我有以下构造函数......

public FooClass(string name = "theFoo")
{ fooName = name; }

public FooClass(string name, int num = 7, bool boo = true) : this(name)
{ fooNum = num; fooBool = boo; }

是否可以使用命名参数......?

FooClass foo1 = new FooClass(num:1);  

//我只传递一个命名参数,依靠选项来处理其余的

或者没有参数调用构造函数FooClass(s​​tring,int,bool)?如......

FooClass foo2 = new FooClass();

2 个答案:

答案 0 :(得分:6)

使用命名和可选参数会以下列方式影响重载解析:

  • 如果方法,索引器或构造函数的每个参数都是可选的,或者按名称或位置对应于调用语句中的单个参数,则该方法,索引器或构造函数是执行的候选者,并且该参数可以转换到参数的类型。

  • 如果找到多个候选项,则首选转换的重载解析规则将应用于显式指定的参数。忽略可选参数的省略参数。

  • 如果两个候选人被判断为同样好,则优先选择没有可选参数的候选人,其中参数在呼叫中被省略。这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。

http://msdn.microsoft.com/en-us/library/dd264739.aspx

答案 1 :(得分:0)

可选参数在任何必需参数之后在参数列表的末尾定义。如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。不支持参数列表中以逗号分隔的间隙。

此外,

命名参数可以跟随位置参数,如下所示。 CalculateBMI(123,身高:64​​); 但是,位置参数不能遵循命名参数。以下语句导致编译器错误。 // CalculateBMI(重量:123,64);