簡體   English   中英

C#中的switch語句“使用未分配的局部變量”編譯器錯誤?

[英]“Use of unassigned local variable” compiler error for switch statement in C#?

我有以下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可能沒有值,具體取決於用戶輸入,因此該如何解決?

理想情況下,如果輸入了未知的動物類型,我想顯示一條錯誤消息,並讓用戶再次輸入該值。

謝謝。

這是修復它的一種方法,它使用遞歸調用而不是捕獲和引發異常,或者使用循環(在這種情況下循環使我的意思難以理解;關於您的工作方式而不是您的工作太多了在做):

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 (s.Equals("dog", StringComparison.CurrentCultureIgnoreCase)) (或適當的不區分大小寫的比較)將其重構為一個if / else鏈是一種很好的做法,其他文化。 當然,這可能不適用於您的方案(例如,測試/家庭作業應用程序,或僅在您的文化中可能使用的某些應用程序)。


更新:感謝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();
    }
}

如果需要將它們分開的靈活性,請保留現有的開關。

如果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;
}
AnimalTypeEnum animal;
var s = Console.ReadLine();
Console.WriteLine(!Enum.TryParse(s, true, out animal) ? "Not a valid animal" : animal.ToString());

您應該為代碼未知的任何動物設置默認的ENUM 您甚至可以編寫代碼來學習新動物。 例如。

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

要么

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

您的MakeEnum基本上只需要檢查當前枚舉數的長度,並使用number或其他一些參數創建一個新的枚舉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM