构造函数可访问性C#编译器错误CS0122和CS1729

①在下面的C#代码中,CS1729发生,但我理解CS0122将更合适。

namespace A
{
  class Program
  {
    static void Main()
    {
      Test test = new Test(1);
    }
  }
  class Test
  {
    Test(int i) { }
  }
}

CS1729:’A.Test’不包含带有1个参数的构造函数

CS0122:’A.Test.Test(int)由于其保护级别不可访问“

②在下面的C#代码中,CS0122发生,但我理解CS1729将更合适

namespace A
{
  class Program
  {
    static void Main()
    {
      Test test = new Test();
    }
  }
  class Test
  {
    Test(int i) { }
  }
}   

CS0122:’A.Test.Test(int)由于其保护级别不可访问“

CS1729:’A.Test’不包含接受0个参数的构造函数

问题:为什么CS0122和CS1729在①和②中被交换,或者是这个C#编译器错误?

P.S .:在①和②中的错误可以用Microsoft Visual C#2010编译器版本4.030319.1复制。

完全公开:我在微软的C#团队工作。

编译器的诊断报告是一个棘手的事情!我们花了很多时间来确保针对特定错误条件报告“最佳”诊断。然而,这有时需要考虑启发式,我们并不总是这样。在这种情况下,正如@Henrik Holterman指出的,两个错误都是合理的(至少对于第二种情况)。

第一个例子显然是一个错误,虽然它是低严重性。毕竟,它仍然是一个错误与一个“正确”(我是有点亲切的)诊断。在第二个例子中,两个错误都是正确的,但编译器无法选择“最好”,希望是最有用的诊断。

使用Roslyn C#编译器,我们有机会重新审视我们的诊断报告,并做出更好的选择。对于这些特定的例子,Roslyn编译器确实会产生你所期望的错误。在第一示例中,报告CS0122,在第二情况下,报告CS1729。所以,你可以放心,这已经在未来的版本中已经固定。

http://stackoverflow.com/questions/21804167/constructor-accessibility-c-sharp-compiler-error-cs0122-vs-cs1729

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:构造函数可访问性C#编译器错误CS0122和CS1729