gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:11:33 25 4
gpt4 key购买 nike

① 在下面的 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 重现。

最佳答案

全面披露:我在 Microsoft 的 C# 团队工作。

来自编译器的诊断报告是一项棘手的工作!我们花费大量时间来确保针对特定错误情况报告“最佳”诊断。然而,这有时需要考虑启发式方法,而我们并不总是能做到这一点。在这种情况下,正如@Henrik Holterman 指出的那样,这两个错误都是合理的(至少对于第二种情况)。

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

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

关于c# - 构造函数可访问性 C# 编译器错误 CS0122 与 CS1729,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com