使用默认参数的构造函数重载

问题描述 投票:0回答:5

我不小心重载了 C# 中的构造函数,如下所示:

public MyClass(string myString) 
{
    // Some code goes here 
}

public MyClass(string myString, bool myParameter = false) 
{
   // Some different code here
}

使用这段代码我的项目编译得很好。 如果我仅使用

string
参数调用构造函数,C# 如何决定我要使用哪个构造函数? 为什么语法上允许此功能?

c# constructor overloading
5个回答
13
投票

来自MSDN:(强调)

如果两个候选者被认为同样优秀,则优先考虑没有可选参数的候选者,在调用中省略了参数。这是对具有“较少参数”的候选者的重载决策的普遍偏好的结果。


11
投票
为什么这个功能在语法上是允许的?

就生成的IL而言,第二个构造函数仍然是两个参数。 唯一的区别是第二个参数有一个提供默认值的属性。

就编译器而言,当您使用单个字符串调用构造函数时,第一个在技术上仍然更适合。 当您使用单个参数调用此函数时,最佳匹配是第一个构造函数,第二个构造函数将不会被调用。

C# 规范阐明了这一点。 在 7.5 中,它指出“...实例构造函数使用重载决策来确定要调用候选函数成员集中的哪一个”。 然后在 7.5.3.2 中指定具体规则,其中适用该具体规则:

否则,如果 MP 的所有参数都有对应的参数,而默认参数需要替换 MQ 中的至少一个可选参数,那么 MP 比 MQ 更好。

在这种情况下,MP(您的第一个构造函数)具有所有参数,但 MQ(您的第二个构造函数)需要“至少一个可选参数。”


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

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

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

如果两名候选人被认为同样优秀,则优先考虑 没有可选参数的候选者,其参数 在通话中被省略。这是一个普遍现象的结果 优先考虑超载决策,优先考虑拥有较少资源的候选者 参数。

引自
MSDN


1
投票
带有可选参数的方法将被重载隐藏。

甚至还有一个 ReSharper 规则来警告您。

enter image description here在这里您可以找到关于为什么允许这样做的有用讨论。 有些人甚至认为这根本不是问题。

http://youtrack.jetbrains.com/issue/RSRP-287157


0
投票

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

    方法、索引器或构造函数是执行的候选者,如果 它的每个参数要么是可选的,要么是对应的,按名称或 按位置,调用语句中的单个参数,并且 argument 可以转换为参数的类型。
  • 如果找到多个候选者,则重载解析规则 首选转换应用于以下参数
  • 明确指定。可选参数省略的参数是

    被忽略了。

  • 如果两名候选人被认为同样优秀,则优先考虑 没有可选参数的候选者
  • 调用中省略了参数。这是

    的结果 对于具有以下特征的候选人,一般优先选择超载解决方案: 更少的参数。


© www.soinside.com 2019 - 2024. All rights reserved.