メソッドは呼び出し元のコードにデータを返すことができ、戻り値は呼び出し式の箇所にそのまま置き換わります。
データを返す必要がある場合、メソッド名の前に戻り値の型を宣言しなければなりません。戻り値が存在しない場合はvoidと記述します。
戻り値のないメソッドでもreturnは利用可能です。ただし「return 値;」とは書かず、単に「return;」だけを記述します。これは実行を中断する意味で、以降のコードは実行されず、呼び出し元へ処理が戻ります。
int Add(int a, int b) // int型の値を返す
{
return a + b;
}Code language: JavaScript (javascript)
void SayHi() // 戻り値なし
{
Console.WriteLine("hello welcome to foxdevelop.com");
}Code language: JavaScript (javascript)
1、戻り値を持つメソッドには必ず return 式; を使用します。式の実行結果の型は、宣言した戻り値の型と一致している必要があります;
int Add(int a, int b)
{
return 1.2; // エラー。1.2はdouble型であり、intへ暗黙的に変換できないため型不一致でエラーとなる
}Code language: JavaScript (javascript)
上記コードはdoubleの値を返そうとしています。リテラルの1.2は既定でdouble、すなわち浮動小数点数(小数)となります。コンパイラは小数を整数に自動変換できないためエラーが発生します。
逆のケースを見てみましょう
double Add2()
{
return 10; // 10はint型だがdoubleへ暗黙変換可能。型が適合するためエラーなし
}Code language: JavaScript (javascript)
こちらはエラーになりません。10は整数リテラルですがdoubleへ暗黙的に変換可能なため型が適合します。単純に型名だけ比較せず、暗黙変換の可否を確認する必要があります。
暗黙的変換とは、開発者が変換コードを記述せず、コンパイラ側で自動的に型変換を行う仕組みのことです。対照的に開発者が明示的に記述する変換は明示的変換と呼びます。
型変換については後の章で学習します。
2、戻り値を持つメソッドでは、すべての実行経路で最終的にreturnが実行される必要があります。returnに到達しない分岐が存在してはいけません。

上のメソッドはAddの前にintと宣言しintを返すルールですが、メソッド本体にreturn文が一つもない場合、こちらもエラーになります。

この記述方法もエラーとなります。returnはifの条件が成立したときだけ実行され、a >= bとなる場合returnが実行されない経路が生まれるためです。

elseを追加したとしても、else内部にreturnがなければ同じ問題が発生します。returnに到達しない分岐が残るからです。このルールは他の制御構文でも同様で、すべての実行経路を適切に処理しなければなりません。
回避策が一つ存在します。メソッド末尾にreturnを追加して保険とする方法です。例は以下の通り
int Add(int a, int b)
{
if (a < b)
{
return a + b;
}
else
{
}
return -1; // 前の分岐に関わらずここまで実行されたら値を返す
// -1が保険用の戻り値となる。
}Code language: C# (cs)
戻り値には基本型(int、stringなど)、独自クラス、コレクションといったすべてのデータ型を利用可能;
returnが実行されると現在のメソッドは即時終了し、後続のコードは実行されません;
戻り値を持つメソッドの呼び出しは、式へ埋め込んだり出力・代入処理に直接記述可能です。
戻り値