构造函数使用默认参数重载(Constructor Overloading with Default

2019-06-26 10:40发布

我不小心重载在C#构造函数如下:

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

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

有了这个代码我的项目编译罚款。 如果我打电话只是一个构造函数string参数,如何C#决定我想要使用的构造函数? 为什么这个功能允许语法?

Answer 1:

为什么这个功能允许语法?

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

至于编译器而言,首先是技术上还是更适合当你调用一个单一字符串的构造函数。 当你调用这个带一个参数,最佳搭配是第一个构造函数,第二个将不被调用。

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

否则,如果MP的所有参数具有相应的参数,而默认参数需要在MQ用于替换至少一个可选的参数则MP比MQ更好。

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



Answer 2:

从MSDN :(强调)

如果两个候选人被判断为一样好,偏好去不有哪些参数是在调用省略可选参数的候选人。 这是重载的一般偏好具有较少参数候选人的结果。



Answer 3:

命名和可选参数的使用影响在以下几个方面重载决议:

一种方法,索引器,或构造为执行一个候选它的每一个参数的任是可选的还是对应,通过名称或位置,以便在调用语句的单个参数,并且参数可以被转换成参数的类型。

如果找到一个以上的候选人,为首选转换重载决策规则应用于被明确指定的参数。 可选参数省略参数被忽略。

如果两个候选人被判断为一样好,偏好去不有哪些参数是在调用省略可选参数的候选人。 这是重载的一般偏好具有较少参数候选人的结果。

引自MSDN 。



Answer 4:

与可选参数的方法将被超载被隐藏。

甚至还有的是,警告你一个ReSharper的规则。

在这里你可以找到关于它为什么允许有益的探讨。 有些人甚至认为这是不是一个问题,在所有。

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



Answer 5:

我敢打赌,它会选择第一种为更合适。

命名和可选参数的使用影响在以下几个方面重载决议:

  • 一种方法,索引器,或构造为执行一个候选它的每一个参数的任是可选的还是对应,通过名称或位置,以便在调用语句的单个参数,并且参数可以被转换成参数的类型。

  • 如果找到一个以上的候选人,为首选转换重载决策规则应用于是参数
    明确指定。 可选参数被省略参数是
    忽略。

  • 如果两个候选人被判断为一样好,偏好去不有哪些可选参数的候选
    争论在通话中被省略。 这是一个结果
    在重载一般偏爱有候选人
    较少的参数。



文章来源: Constructor Overloading with Default Parameters