que - Accesibilidad del constructor C#error del compilador CS0122 vs CS1729
no se ha dado ningun argumento que corresponda al parametro formal requerido c# (1)
① En el siguiente código C #, se produce CS1729 pero entiendo que CS0122 sería más apropiado.
namespace A
{
class Program
{
static void Main()
{
Test test = new Test(1);
}
}
class Test
{
Test(int i) { }
}
}
CS1729 : ''A.Test'' no contiene un constructor que tome 1 argumentos
CS0122 : ''A.Test.Test (int) es inaccesible debido a su nivel de protección''
② En el siguiente código C #, CS0122 ocurre pero entiendo que CS1729 sería más apropiado
namespace A
{
class Program
{
static void Main()
{
Test test = new Test();
}
}
class Test
{
Test(int i) { }
}
}
CS0122 : ''A.Test.Test (int) es inaccesible debido a su nivel de protección''
CS1729 : ''A.Test'' no contiene un constructor que tome 0 argumentos
Pregunta : ¿Hay alguna razón por la que CS0122 y CS1729 se intercambian en ① y ② o es este error del compilador de C #?
PS: Los errores en ① y ② se pueden reproducir con Microsoft Visual C # 2010 Compiler versión 4.030319.1.
Revelación completa: trabajo en el equipo de C # en Microsoft.
¡Los informes de diagnóstico de un compilador son un asunto complicado! Pasamos mucho tiempo tratando de asegurar que se informe el "mejor" diagnóstico para una condición de error particular. Sin embargo, esto a veces requiere tener en cuenta las heurísticas, y no siempre lo hacemos bien. En este caso, como lo señala @Henrik Holterman, ambos errores son razonables (al menos para el segundo caso).
El primer ejemplo es claramente un error, aunque es de baja gravedad. Después de todo, sigue siendo un error con un diagnóstico "correcto" (estoy siendo un poco amable aquí). En el segundo ejemplo, ambos errores son correctos, pero el compilador no pudo seleccionar el "mejor" y, con suerte, el diagnóstico más útil.
Con el compilador Roslyn C #, hemos tenido la oportunidad de analizar de nuevo nuestros informes de diagnóstico y tomar mejores decisiones. Para estos ejemplos particulares, los compiladores de Roslyn producen los errores que usted esperaba. En el primer ejemplo, se informa CS0122, y en el segundo caso, se reporta CS1729. Por lo tanto, puede estar seguro de que esto ya se ha solucionado en una versión futura.