編譯錯誤 · 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 是同一個錯誤在建構子上的版本。