編譯錯誤 · 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 點名沒收到實參的必需形參(給少了)。根源一樣:呼叫與簽名在數量上談不攏。

排查清單