我不小心重载了 C# 中的构造函数,如下所示:
public MyClass(string myString)
{
// Some code goes here
}
public MyClass(string myString, bool myParameter = false)
{
// Some different code here
}
使用这段代码我的项目编译得很好。 如果我仅使用
string
参数调用构造函数,C# 如何决定我要使用哪个构造函数? 为什么语法上允许此功能?
来自MSDN:(强调)
如果两个候选者被认为同样优秀,则优先考虑没有可选参数的候选者,在调用中省略了参数。这是对具有“较少参数”的候选者的重载决策的普遍偏好的结果。
就生成的IL而言,第二个构造函数仍然是两个参数。 唯一的区别是第二个参数有一个提供默认值的属性。
就编译器而言,当您使用单个字符串调用构造函数时,第一个在技术上仍然更适合。 当您使用单个参数调用此函数时,最佳匹配是第一个构造函数,第二个构造函数将不会被调用。
C# 规范阐明了这一点。 在 7.5 中,它指出“...实例构造函数使用重载决策来确定要调用候选函数成员集中的哪一个”。 然后在 7.5.3.2 中指定具体规则,其中适用该具体规则:
否则,如果 MP 的所有参数都有对应的参数,而默认参数需要替换 MQ 中的至少一个可选参数,那么 MP 比 MQ 更好。
在这种情况下,MP(您的第一个构造函数)具有所有参数,但 MQ(您的第二个构造函数)需要“至少一个可选参数。”
使用命名参数和可选参数会通过以下方式影响重载解析:
被忽略了。
的结果
对于具有以下特征的候选人,一般优先选择超载解决方案:
更少的参数。