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

Fab*_*nay 30 c# constructor protection compiler-errors

①在下面的C#代码中,出现了CS1729,但据我所知,CS0122更合适.

namespace A
{
  class Program
  {
    static void Main()
    {
      Test test = new Test(1);
    }
  }
  class Test
  {
    Test(int i) { }
  }
}
Run Code Online (Sandbox Code Playgroud)

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) { }
  }
}   
Run Code Online (Sandbox Code Playgroud)

CS0122:'A.Test.Test(int)由于其保护级别而无法访问'

CS1729:'A.Test'不包含带0参数的构造函数

问题:①和②中交换CS0122和CS1729是否有任何原因或者是这个C#编译器错误?

PS:可以使用Microsoft Visual C#2010编译器版本4.030319.1重现①和②中的错误.

Dus*_*ell 13

完全披露:我在微软的C#团队工作.

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

第一个例子显然是一个错误,尽管它的严重性很低.毕竟,它仍然是一个错误,有点"正确"(我在这里有点亲切)诊断.在第二个示例中,两个错误都是正确的,但编译器未能选择"最佳",并且希望是最有用的诊断.

使用Roslyn C#编译器,我们有机会重新审视我们的诊断报告并做出更好的选择.对于这些特定示例,Roslyn编译器实际上会产生您期望的错误.在第一个例子中,报告了CS0122,在第二个例子中,报告了CS1729.因此,您可以放心,这在以后的版本中已经修复.