编译错误 · 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 点名没收到实参的必需形参(给少了)。根源一样:调用与签名在数量上谈不拢。

排查清单