我不小心重载在C#构造函数如下:
public MyClass(string myString)
{
// Some code goes here
}
public MyClass(string myString, bool myParameter = false)
{
// Some different code here
}
有了这个代码我的项目编译罚款。 如果我打电话只是一个构造函数string
参数,如何C#决定我想要使用的构造函数? 为什么这个功能允许语法?
为什么这个功能允许语法?
中产生的IL而言,所述第二构造函数仍然是两个参数。 唯一的区别是,第二个参数具有提供的默认值的属性。
至于编译器而言,首先是技术上还是更适合当你调用一个单一字符串的构造函数。 当你调用这个带一个参数,最佳搭配是第一个构造函数,第二个将不被调用。
C#的规范阐明了这一点。 在7.5,它指出:“......实例构造函数时,使用重载决策来确定一组候选函数成员的调用。” 具体的规则,然后在7.5.3.2,指定其中这个特定的规则:
否则,如果MP的所有参数具有相应的参数,而默认参数需要在MQ用于替换至少一个可选的参数则MP比MQ更好。
在这种情况下,MP(你的第一个构造函数)具有的所有参数,但MQ(第二个)需要“至少一个可选参数。”
从MSDN :(强调)
如果两个候选人被判断为一样好,偏好去不有哪些参数是在调用省略可选参数的候选人。 这是重载的一般偏好具有较少参数候选人的结果。
命名和可选参数的使用影响在以下几个方面重载决议:
一种方法,索引器,或构造为执行一个候选它的每一个参数的任是可选的还是对应,通过名称或位置,以便在调用语句的单个参数,并且参数可以被转换成参数的类型。
如果找到一个以上的候选人,为首选转换重载决策规则应用于被明确指定的参数。 可选参数省略参数被忽略。
如果两个候选人被判断为一样好,偏好去不有哪些参数是在调用省略可选参数的候选人。 这是重载的一般偏好具有较少参数候选人的结果。
引自MSDN 。
与可选参数的方法将被超载被隐藏。
甚至还有的是,警告你一个ReSharper的规则。
在这里你可以找到关于它为什么允许有益的探讨。 有些人甚至认为这是不是一个问题,在所有。
http://youtrack.jetbrains.com/issue/RSRP-287157