30 votes

Accessibilité du constructeur Erreur du compilateur C # CS0122 vs CS1729

① Dans le code C# suivant, 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 un constructeur qui prend 1 arguments

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

② Dans le code C# suivant, 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 un constructeur qui prend 0 arguments

Question: Est-il une raison pourquoi CS0122 et CS1729 sont inversés ① et ② ou est-ce compilateur C# bug ?

P. S.: les Erreurs dans ① et ② peut être reproduit avec Microsoft Visual C# 2010 Compilateur version 4.030319.1.

13voto

Dustin Campbell Points 6323

La divulgation complète: je travaille sur l'équipe C# de Microsoft.

Le rapport de Diagnostic à partir d'un compilateur est un travail délicat! 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 prendre des heuristiques en compte, et nous n'avons pas toujours obtenir ce droit. Dans ce cas, comme @Henrik Holterman points, les deux erreurs sont raisonnables (au moins pour le second cas).

Le premier exemple est clairement un bug, s'il est de faible gravité. Après tout, c'est toujours une erreur, un peu "correct" (je suis un peu gracieuse ici) de diagnostic. Dans le deuxième exemple, les deux erreurs sont correctes, mais le compilateur n'a pas à choisir les "meilleurs", et, espérons-le, les plus utiles au diagnostic.

Avec le Roslyn compilateur C#, nous avons eu l'occasion de prendre un nouveau regard sur notre rapport de diagnostic et de faire de meilleurs choix. Pour ces exemples, le Roslyn les compilateurs n'en fait produire les erreurs que vous attendiez. Dans le premier exemple, CS0122 est signalé, et dans le second cas, CS1729 est signalé. Ainsi, vous pouvez être assuré que c'est déjà corrigé dans une future version.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X