Вопрос по c#, io, enums, switch-statement – Ошибка использования неназначенной локальной переменной для оператора switch в C #?

-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 может не иметь значения в зависимости от ввода пользователя, так как мне это исправить?

В идеале я хотел бы показать сообщение об ошибке, если был введен неизвестный тип животного, и заставить пользователя снова ввести значение.

Благодарю.

Добавитьdefault: пункт. Ref:msdn.microsoft.com/en-us/library/06tc147t.aspx Joe

Ваш Ответ

4   ответа
4

используя рекурсивные вызовы вместо необходимости отлавливать и выбрасывать исключения, или использовать цикл (циклы в таком случае запутывают смысл, на мой взгляд; слишком много о том, как вы это делаете вместо что вы делаете):

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)) (или соответствующее сравнение без учета регистра), чтобы оно работало в других культурах. Конечно, это может не относиться к вашему сценарию (например, приложение для тестирования / домашней работы или что-то, что, возможно, будет использоваться только в вашей культуре).

Update: Спасибо Mennan Kara за идею, если ваши ценности (например,"dog") всегда будет соответствовать значениям перечисления (например,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();
    }
}

Если вам нужна гибкость их разделения, сохраните существующий коммутатор.

0

ENUM для любого животного, неизвестногоyour code, Вы могли бы даже сделать свой код для изучения новых животных. Например.

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

или же

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

ВашMakeEnum в основном просто нужно проверить длину текущего числа перечислений и создать новое перечисление, используя число или какой-либо другой параметр.

2

s.ToLower() это что-то еще, чтоdog, cat или жеrabbit, animal не имеет значения.

Вы должны добавить default в ваш переключатель для этого случая:

switch (s.ToLower())
{
case "dog":
    animal = AnimalTypeEnum.DOG;
    break;
case "cat":
    animal = AnimalTypeEnum.CAT;
    break;
case "rabbit":
    animal = AnimalTypeEnum.RABBIT;
    break;
default:
    animal = ...
    break;
}
Если вы хотите спросить снова, вы должны поместить это в цикл. И исключения - плохой совет здесь.
Вы не написали метод. И поскольку он обрабатывает пользовательский ввод, он должен бытьbool TryGetAnimalTypeFromString(...)
@ Dr.SteveBrule Тогда брось исключение. Затем вы можете поймать исключение и попросить его использовать другое значение.
Но в случае по умолчанию я не хочу даватьanimal значение, я хочу, чтобы значение было введено снова. XåpplI'-I0llwlg'I -
@HenkHolterman Если код, который я написал, находится в методе, который возвращаетAnimalTypeEnum изstringтогда какArgumentException плохой совет?
2
AnimalTypeEnum animal;
var s = Console.ReadLine();
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString());

Похожие вопросы