-1

私は次のC#コードを持っています:

AnimalTypeEnum animal;
string s = Console.ReadLine();
switch (s.ToLower())
{
case "dog":
    animal = AnimalTypeEnum.DOG;
    break;
case "cat":
    animal = AnimalTypeEnum.CAT;
    break;
case "rabbit":
    animal = AnimalTypeEnum.RABBIT;
    break;
}

Console.WriteLine(animal); #compiler error here

最後の行でこのエラーが発生します:Use of unassigned local variable 'animal'animalユーザーの入力によっては値がない可能性があるためだと思いますが、どうすれば修正できますか?

理想的には、不明な動物の種類が入力された場合にエラーメッセージを表示し、ユーザーに値を再入力させたいと思います。

ありがとう。

4

4 に答える 4

4

これを修正する1つの方法は、例外をキャッチしてスローする代わりに再帰呼び出しを使用するか、ループを使用することです(このような場合のループは、私の意見では意味を曖昧にします。やってる):

private static AnimalTypeEnum GetAnimalFromInput()
{
    AnimalTypeEnum animal;
    string s = Console.ReadLine();
    switch (s.ToLower())
    {
        case "dog":
            animal = AnimalTypeEnum.DOG;
            break;
        case "cat":
            animal = AnimalTypeEnum.CAT;
            break;
        case "rabbit":
            animal = AnimalTypeEnum.RABBIT;
            break;
        default:
            Console.WriteLine(s + " is not valid, please try again");
            animal = GetAnimalFromInput();
            break;
    }
    return animal;
}
static void Main(string[] args)
{
    AnimalTypeEnum animal = GetAnimalFromInput();

    Console.WriteLine(animal);
}

また、スイッチをif / elseチェーンにリファクタリングし、if (s.Equals("dog", StringComparison.CurrentCultureIgnoreCase))他のカルチャで機能し続けるために(または大文字と小文字を区別しない適切な比較)を使用することをお勧めします。もちろん、これはシナリオには当てはまらない場合があります(たとえば、テスト/宿題アプリ、または文化でのみ使用される可能性のあるもの)。


更新: Mennan Karaのアイデアに感謝します。値(eg "dog")が常に列挙型の値(eg)と一致する場合は、コードを改善するためにDOG使用できます。Enum.TryParse

private static AnimalTypeEnum GetAnimalFromInput()
{
    AnimalTypeEnum animal;
    string s = Console.ReadLine();
    if (Enum.TryParse(s, true, out animal))
        return animal;
    else
    {
        Console.WriteLine(s + " is not valid, please try again");
        return GetAnimalFromInput();
    }
}

それらを分離する柔軟性が必要な場合は、既存のスイッチを維持してください。

于 2012-07-29T12:51:40.950 に答える
2

ケースは、、または、に値がない他のs.ToLower()何かです。dogcatrabbitanimal

その場合は、スイッチにデフォルトを追加する必要があります。

switch (s.ToLower())
{
case "dog":
    animal = AnimalTypeEnum.DOG;
    break;
case "cat":
    animal = AnimalTypeEnum.CAT;
    break;
case "rabbit":
    animal = AnimalTypeEnum.RABBIT;
    break;
default:
    animal = ...
    break;
}
于 2012-07-29T12:47:00.210 に答える
2
AnimalTypeEnum animal;
var s = Console.ReadLine();
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString());
于 2012-07-29T12:58:59.807 に答える
0

コードENUMが不明な動物にはデフォルトが必要です。新しい動物を学ぶためのコードを作成することもできます。例えば。

switch (s.ToLower())
{
default:
    animal = AnimalType.Unkown;
    break;
}

また

default:
    animal = new MakeEnum(s.ToLower());
    myEnumList.Add(animal);
    break;

基本MakeEnum的には、現在の列挙型の数の長さを確認し、その数またはその他のパラメーターを使用して新しい列挙型を作成する必要があります。

于 2012-07-29T13:19:04.020 に答える