2022年07月31日
川俣晶の縁側ソフトウェア技術雑記total 857 count

C#の【値を返さないコード パス】とは何かという問題

Written By: 川俣 晶連絡先

※ 最新の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 }

Facebook

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20220731111622
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.