Code Fix

初級

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が適しています。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)