0

次のように定義された列挙型があります。

public enum CrystalTypeEnum { Red, White, Blue, Green };

そして、特定の列挙値の文字列表現を返す静的関数があります。

public static string toString(CrystalTypeEnum type)
{
    switch (type)
    {
        case CrystalTypeEnum.Red:
            return "Red";
        case CrystalTypeEnum.White:
            return "White";
        case CrystalTypeEnum.Blue:
            return "Blue";
        case CrystalTypeEnum.Green:
            return "Green";
    }
}

コードをコンパイルすると、次のエラーが発生します。

CrystalType.toString(CrystalType.CrystalTypeEnum): すべてのコード パスが値を返すわけではありません

switch ステートメントが明らかに 4 つのケース(赤、白、青、緑)をすべてカバーしているのに、このエラーが発生するのはなぜですか。

4

5 に答える 5

7

制御がない場合default:は、switch ステートメントの外に移動します (ケースで処理されない値の場合)。これは、default:then がない場合、メソッドの戻り値の型によって定義された型の値を返すスイッチの後に return ステートメントが必要であることを意味します。

于 2012-08-15T04:28:29.000 に答える
6

デフォルトのセクションを指定する必要があります。

switch (type) 
{ 
    case CrystalTypeEnum.Red: 
        return "Red"; 
    case CrystalTypeEnum.White: 
        return "White"; 
    case CrystalTypeEnum.Blue: 
        return "Blue"; 
    case CrystalTypeEnum.Green: 
        return "Green"; 
    default:
        //return what you need here
} 
于 2012-08-15T04:24:28.523 に答える
3

switch\case 構築でこのセクションを使用することを忘れないでください:

switch (type) 
{
    default:
        throw new ArgumentException("Incorrect CrystalTypeEnum");
} 
于 2012-08-15T04:49:09.333 に答える
2

switch ステートメントが明らかに 4 つのケース (赤、白、青、緑) をすべてカバーしているのに、このエラーが発生するのはなぜですか。

4つではなく、合計5つのケースがあるためです。これらの定義された列挙値のいずれでもない整数をCrystalTypeEnum型にキャストできますが、それは引き続き有効です。

CrystalType.toString((CrystalTypeEnum)(42));

では、switch ステートメントでは常に default が必要ですか?

switchいいえ、 「すべてのコードパスが値を返す」限り、句全体または何かの後に return ステートメントを配置できます。

于 2012-08-15T04:39:57.080 に答える
1

astander によって投稿された回答があなたが探しているものである可能性があることは知っていますが、switch ステートメントを必要としない、これを行うためのエレガントな方法があります。

メソッドを使用Enum.GetNameして、列挙値の文字列表現を取得できます。ここを読んでください

于 2012-08-15T04:37:38.047 に答える