※ 最新のVisual Studio 2022 Previewと.NET 7 Preview1を使用
サンプルコード1に掲載したようなコードがあるとします。
メソッドsub1はif-elseですが、sub2は逆条件の式が2つ並べてあります。
どちらも同じ動作を記述しているはずです。
しかし、コンパイル結果は異なります。
sub2は【値を返さないコード パスがあります】というエラーになります。
どうも、C#コンパイラは条件判定式の中味を吟味せず、単純にif文の流れだけを追いかけて値を返さないコード パスがあると判断しているようです。
しかし、サンプルコード2の場合、switch文で全ての経路が列挙されていることは認識でき、default節がなくても警告は出ません。
ですが、サンプルコード3の場合は【値を返さないコード パスがあります】というエラーになります。どうも、列挙体の場合は列挙された全ての値が揃っていても、他の整数値が入っている可能性があるので、値を返さないコード パスがあると判断しているようです。
というわけで結論。
- 値を返すメソッドは、絶対に通らない箇所にreturn文を要求されてしまう可能性がある
- returnするswitch文は値を全部case節に並べるとdefault抜きで【全てのコードパスにreturn文がある】と見なしてくれるが、そのために列挙する項目の数は半端なく多いので、あまり当てにしない方が良いのかも知れない
- 列挙体は名前を付けられる整数でしかない
サンプルコード1 §
sub1(ESample.A);
sub2(ESample.A);
// OK
int sub1(ESample x)
{
if (x == ESample.A)
return 1;
else
return 2;
}
// 値を返さないコード パスがあります
int sub2(ESample x)
{
if (x == ESample.A)
return 1;
if (x != ESample.A)
return 2;
}
public enum ESample { A, B }
サンプルコード2 §
Console.WriteLine(sub(0));
int sub(byte x)
{
switch (x)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
(中略)
case 254:
case 255:
return 0;
}
}
サンプルコード3 §
Console.WriteLine(sub(ESample.A));
int sub(ESample x)
{
switch (x)
{
case ESample.A:
case ESample.B:
return 0;
}
}
enum ESample { A, B }