No overload for method の原因と直し方
メソッドの引数の数や型が定義と一致しないときに出ます。オーバーロード解決の仕組みを理解する入り口になります。
エラーメッセージの読み方
Program.cs(4,34): error CS1501: No overload for method 'Add' takes 3 arguments
Program.cs- ファイル名
4- 行番号
34- 列番号 — この位置でコンパイラが解析に失敗しました
CS1501- エラーコード — 検索するとMicrosoftの解説ページが見つかります
No overload for method 'Add' takes 3 arguments- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 class Program { 2 static int Add(int a, int b) { return a + b; } 3 static void Main(string[] args) { 4 System.Console.WriteLine(Add(1, 2, 3 )); ^ 5 } 6 }
Program.cs(4,34): error CS1501: No overload for method 'Add' takes 3 arguments
Addは引数を2つしか受け取りません。定義と異なる個数で呼び出すとオーバーロードが見つかりません。
直し方: , 3 を (空) にします。
広告
広告スロット(未設定)
パターン2
1 class Program { 2 static int Triple(int a, int b, int c) { return a + b + c; } 3 static void Main(string[] args) { 4 System.Console.WriteLine(Triple(1, 2 )); ^ 5 } 6 }
Program.cs(4,34): error CS7036: There is no argument given that corresponds to the required parameter 'c' of 'Program.Triple(int, int, int)'
Tripleは3つの引数が必須です。1つ足りないとその個数向けのオーバーロードがないと判断されます。
直し方: (空) を , 3 にします。
パターン3
1 class Program { 2 static double Half(double n) { return n / 2; } 3 static void Main(string[] args) { 4 System.Console.WriteLine(Half(4, 2 )); ^ 5 } 6 }
Program.cs(4,34): error CS1501: No overload for method 'Half' takes 2 arguments
Halfは引数を1つしか取りません。余分な引数を渡すと一致するオーバーロードがなくなります。
直し方: , 2 を (空) にします。
パターン4
1 class Program { 2 static int Sum(int a, int b) { return a + b; } 3 static void Main(string[] args) { 4 System.Console.WriteLine(Sum(5, 6, 7 )); ^ 5 } 6 }
Program.cs(4,34): error CS1501: No overload for method 'Sum' takes 3 arguments
Sumは引数を2つしか受け取りません。3つ渡すと一致するオーバーロードがありません。
直し方: , 7 を (空) にします。
パターン5
1 class Program { 2 static double Avg(double a, double b, double c) { return (a + b + c) / 3; } 3 static void Main(string[] args) { 4 System.Console.WriteLine(Avg(1, 2 )); ^ 5 } 6 }
Program.cs(4,34): error CS7036: There is no argument given that corresponds to the required parameter 'c' of 'Program.Avg(double, double, double)'
Avgは3つの引数が必須です。1つ足りないとその個数向けのオーバーロードが見つかりません。
直し方: (空) を , 3 にします。
よくある誤解
引数の数が定義と1つでも違うと、コンパイラは「一致するオーバーロードがない」と判断します。デフォルト引数がない限り省略はできません。
実務での勘所
引数の数の融通を利かせる方法はC#に2つあります。1つはメソッド定義側でint Add(int a, int b = 0)のように既定値付きの引数(オプション引数)を用意し、省略時の値をあらかじめ決めておく方法です。もう1つは、個数が本当に不定な場合にparams int[] numbersのように書き、呼び出し側がいくつでも(0個でも)値を並べて渡せるようにする方法です。単に「呼び出しごとに引数を省略したい」だけならオプション引数、「そもそも個数が決まっていない」ならparamsが適しています。