编译错误 · error CS1501 / CS7036
方法"X"没有采用 N 个参数的重载
你的调用和方法的参数表在数量上谈崩了。CS1501 是"给多了"的形态;CS7036 在必填参数没收到实参时触发。
亲眼看两者发生
Console.WriteLine(Math.Max(3)); // Max 需要两个值才能比——只给了一个
void PrintScore(string name, int score)
{
Console.WriteLine(name + ": " + score);
}
PrintScore("Ada"); // 'score' 从来没收到值——CS7036 会点名它
修法一:给方法要的东西
Console.WriteLine(Math.Max(3, 7));
void PrintScore(string name, int score)
{
Console.WriteLine(name + ": " + score);
}
PrintScore("Ada", 95);
诊断信息会点名你饿着的那个形参——读它,然后查方法签名(VS 里 F12 / 转到定义),把名字和槽位一一核对。
修法二:本意是"可选"?那就声明成可选
void PrintScore(string name, int score = 0) // 默认值让它变成可选
{
Console.WriteLine(name + ": " + score);
}
PrintScore("Ada"); // score 落回默认值 0
PrintScore("Bob", 95);
可选参数从右往左填充——可以省略 score,永远不能省略 name。这也是可选参数必须排在必填参数后面的原因。
重载造成的困惑
同一个方法名、不同参数表 = 重载。编译器按数量和类型挑选——全都对不上时就报 CS1501,哪怕同名方法确实存在:
void Print(int x) { … }
void Print(string s) { … }
void Print(int x, int y) { … }
Print(1); // ✓ 第一个重载
Print("hi"); // ✓ 第二个
Print(1, 2); // ✓ 第三个
Print(1.5); // ✗ CS1503/CS1501 领域:不存在 Print(double)
常见问答
怎么修 C# 里的 CS1501?
调用参数个数与任何重载都不匹配。对照签名数参数——CS7036 会点名被遗忘的参数。补上实参,或给参数声明默认值(从右往左填充)。
CS1501 和 CS7036 有什么区别?
CS1501 是"没有重载接受 N 个参数"(给多了);CS7036 点名没收到实参的必需形参(给少了)。根源一样:调用与签名在数量上谈不拢。
排查清单
- 对照签名数一遍实参——错误文本里两个数字都有。
- CS7036 点名了你漏掉的参数——通常是第二或第三个。
- 可选参数:声明默认值,并记住它们从右往左填充。
- 命名参数能救 odd 顺序:
PrintScore(score: 95, name: "Ada")。 - 相关:CS1729 是同一个错误在构造器上的版本。