8

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

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();
4

2 回答 2

8

命名和可选参数的使用通过以下方式影响重载决议:

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

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

  • 如果两个候选者被判断为同样好,则优先考虑没有可选参数的候选者,在调用中省略了这些参数。这是对具有较少参数的候选者的重载解决方案的普遍偏好的结果。

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

于 2012-02-24T04:27:26.363 回答
0

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

还,

命名参数可以跟随位置参数,如此处所示。计算BMI(123,身高:64​​);但是,位置参数不能跟在命名参数之后。以下语句会导致编译器错误。//计算BMI(体重: 123, 64);

于 2015-01-14T20:12:43.423 回答