Code Fix

初級

not all code paths return a value の原因と直し方

値を返すと宣言したメソッドで、すべての実行経路にreturn文があるかをコンパイラが検証します。

エラーメッセージの読み方

Program.cs(2,16): error CS0161: 'Program.Twice(int)': not all code paths return a value
Program.cs
ファイル名
2
行番号
16
列番号 — この位置でコンパイラが解析に失敗しました
CS0161
エラーコード — 検索するとMicrosoftの解説ページが見つかります
'Program.Twice(int)': not all code paths return a value
内容 — 期待していたもの、または受け付けられなかったもの

このエラーが出る典型パターン

パターン1

 1  class Program {
 2      static int Twice(int n) {
 3          int r = n * 2;
 4                   
                ^
 5      }
 6      static void Main(string[] args) {
 7          System.Console.WriteLine(Twice(3));
 8      }
 9  }
Program.cs(2,16): error CS0161: 'Program.Twice(int)': not all code paths return a value

int型を返すと宣言したメソッドは、すべての実行経路でreturn文が必要です。

直し方: (空) を return r; にします。

この問題を解いてみる →

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

パターン2

 1  class Program {
 2      static bool IsPositive(int n) {
 3          if (n > 0) {
 4              return true;
 5          }
 6                       
                  ^
 7      }
 8      static void Main(string[] args) {
 9          System.Console.WriteLine(IsPositive(-1));
10      }
11  }
Program.cs(2,17): error CS0161: 'Program.IsPositive(int)': not all code paths return a value

if分岐にしかreturnがありません。elseに相当する経路にもreturnが必要です。

直し方: (空) を return false; にします。

この問題を解いてみる →

パターン3

 1  class Program {
 2      static string Greet(string name) {
 3          string msg = "Hi, " + name;
 4                     
                 ^
 5      }
 6      static void Main(string[] args) {
 7          System.Console.WriteLine(Greet("A"));
 8      }
 9  }
Program.cs(2,19): error CS0161: 'Program.Greet(string)': not all code paths return a value

string型を返すと宣言した以上、最後まで到達する経路にもreturn文が必要です。

直し方: (空) を return msg; にします。

この問題を解いてみる →

パターン4

 1  class Program {
 2      static int Square(int n) {
 3          int r = n * n;
 4                   
                ^
 5      }
 6      static void Main(string[] args) {
 7          System.Console.WriteLine(Square(4));
 8      }
 9  }
Program.cs(2,16): error CS0161: 'Program.Square(int)': not all code paths return a value

int型を返すメソッドは、すべての実行経路でreturn文が必要です。

直し方: (空) を return r; にします。

この問題を解いてみる →

パターン5

 1  class Program {
 2      static bool IsEven(int n) {
 3          if (n % 2 == 0) {
 4              return true;
 5          }
 6                       
                  ^
 7      }
 8      static void Main(string[] args) {
 9          System.Console.WriteLine(IsEven(3));
10      }
11  }
Program.cs(2,17): error CS0161: 'Program.IsEven(int)': not all code paths return a value

if分岐にしかreturnが無いと、それ以外の経路の戻り値が保証されません。

直し方: (空) を return false; にします。

この問題を解いてみる →

よくある誤解

if文の中だけにreturnがあっても、else に相当する経路が無い場合はコンパイルエラーになります。すべての実行経路を確認する必要があります。

実務での勘所

この検査は、単に「return文がその関数のどこかに書いてあるか」ではなく、制御フローの解析によって「そのメソッドの末尾に到達しうるかどうか」を厳密に追跡しています。たとえばwhile (true) { ... }のように、途中でreturnやbreakによる脱出が無い無限ループで終わるメソッドは、コンパイラが「末尾に到達することは無い」と判断できるため、return文が1つも無くてもエラーになりません。「returnを書いたかどうか」ではなく「末尾に届く経路が本当に存在するか」で判定されている、という理解が正確です。

演習をはじめる

関連するエラー

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