Accessibilité du constructeur c# erreur du compilateur CS0122 vs CS1729

e n suivant le code C#, CS1729 se produit, mais je comprends que CS0122 serait plus approprié.

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

CS1729: 'A. Test' ne contient pas de constructeur qui prend 1 arguments

CS0122: 'A. Test.Test (int) est inaccessible en raison de son niveau de protection'

e n suivant le code C#, CS0122 se produit, mais je comprends que CS1729 serait plus approprié

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

CS0122: A. Test.Test (int) est inaccessible en raison de son niveau de protection'

CS1729: 'A. Test' ne contient pas de constructeur qui prend 0 arguments

Question: est - ce qu'il y a une raison pour laquelle CS0122 et CS1729 sont échangés dans le PISA et le Pisa ou est-ce que C# compiler bug ?

P.S.: les erreurs dans les normes relatives aux biens et services peuvent être reproduites avec la version 4.030319.1 du compilateur Visual C# 2010 de Microsoft.

30
demandé sur Toto 2014-02-16 01:56:16

1 réponses

divulgation complète: je travaille sur L'équipe C# chez Microsoft.

le rapport de Diagnostic d'un compilateur est une affaire délicate! Nous passons beaucoup de temps à essayer de s'assurer que les "meilleurs" diagnostic est signalé pour une condition d'erreur. Cependant, cela nécessite parfois de tenir compte de l'heuristique, et nous n'avons pas toujours raison. Dans ce cas, comme le souligne @Henrik Holterman, les deux erreurs sont raisonnables (au moins dans le second cas).

Le premier exemple est clairement un bug, bien qu'il soit de faible gravité. Après tout, c'est toujours une erreur avec un diagnostic un peu "correct" (je suis un peu aimable ici). Dans le second exemple, les deux erreurs sont correctes, mais le compilateur n'a pas choisi le "meilleur" et, espérons-le, le diagnostic le plus utile.

avec le compilateur Roslyn C#, nous avons eu l'occasion de jeter un regard neuf sur nos rapports de diagnostic et de faire de meilleurs choix. Pour ces exemples particuliers, les compilateurs Roslyn produisent en fait les erreurs que vous attendiez. Dans le premier exemple, CS0122 est déclaré, et dans le deuxième cas, CS1729 est déclaré. Ainsi, vous pouvez être assuré que c'est déjà corrigé dans une future version.

13
répondu Dustin Campbell 2014-02-19 15:15:15