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

C#:使用可选参数重载构造函数&;命名参数?,c#,optional-parameters,named-parameters,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)

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

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

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

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

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

  • 如果两个候选者被判定为同等优秀,则优先选择没有可选参数的候选者,因为调用中省略了这些参数。这是因为对于参数较少的候选者,重载解析的一般偏好


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

而且

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

试试看怎么样?你的密码就在那里。。。你告诉我它是否有效!好的,我应该指定示例代码不起作用,我想知道如何使其起作用。我知道它会比较签名,但您能否重新表述我的示例代码使其起作用?它如何“不起作用?”它是否调用了错误的重载?它是否引发异常?抱歉,输入太快。。。所以对于第一种情况,在没有明确说明参数的情况下,所有选项都被忽略,导致调用较小的签名。。。在第二种情况下,使用FooClass()调用重载是不可能的。。。因此,答案是无法使用带省略可选参数的命名?引发异常…错误CS1739最佳重载没有参数“num”要使其调用包含
num
参数的重载,还必须提供
name
参数。由于在第二个重载中没有为
name
参数指定可选值,因此它不是可选参数。