【问题标题】:C# : overloading constructors with optional parameters & named arguments?C#:使用可选参数和命名参数重载构造函数?
【发布时间】:2012-03-14 14:01:33
【问题描述】:

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

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

【问题讨论】:

  • 试试看怎么样?你有代码......你告诉我它是否有效!
  • 好的,我应该指定示例代码不起作用,我想知道如何使它起作用。

标签: c# optional-parameters named-parameters


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我知道它会比较签名,但您能否改写我的示例代码以使其正常工作?
  • 它是如何“不工作”的?它会调用错误的重载吗?它会抛出异常吗?
  • 抱歉输入得太早了...所以对于第一种情况,如果没有明确说明参数,所有选项都将被忽略,导致调用较小的签名...在第二种情况下调用重载使用 FooClass(),这是不可能的......所以答案是不可能使用带有省略的可选参数的命名?
  • 抛出异常...错误 CS1739 最佳重载没有参数'num'
  • 要让它调用带有num 参数的重载,您还必须提供name 参数。由于您没有在第二次重载中为name 参数指定可选值,因此它不是可选参数。
【解决方案2】:

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

还有,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2012-11-30
    • 2017-12-17
    • 2021-09-14
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多