这不是关于正确编码实践的问题,我只是在研究语义。 假设我有以下构造函数......
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(string,int,bool)?如......
FooClass foo2 = new FooClass();
答案 0 :(得分:6)
使用命名和可选参数会以下列方式影响重载解析:
如果方法,索引器或构造函数的每个参数都是可选的,或者按名称或位置对应于调用语句中的单个参数,则该方法,索引器或构造函数是执行的候选者,并且该参数可以转换到参数的类型。
如果找到多个候选项,则首选转换的重载解析规则将应用于显式指定的参数。忽略可选参数的省略参数。
如果两个候选人被判断为同样好,则优先选择没有可选参数的候选人,其中参数在呼叫中被省略。这是对具有较少参数的候选者的重载分辨率的一般偏好的结果。
答案 1 :(得分:0)
可选参数在任何必需参数之后在参数列表的末尾定义。如果调用者为一系列可选参数中的任何一个提供参数,则它必须为所有前面的可选参数提供参数。不支持参数列表中以逗号分隔的间隙。
此外,
命名参数可以跟随位置参数,如下所示。 CalculateBMI(123,身高:64); 但是,位置参数不能遵循命名参数。以下语句导致编译器错误。 // CalculateBMI(重量:123,64);