簡體   English   中英

為什么“並非所有代碼路徑都返回一個值”,帶有switch語句和枚舉?

[英]Why do “Not all code paths return a value” with a switch statement and an enum?

我有以下代碼:

public int Method(MyEnum myEnum)
{
    switch (myEnum)
    {
        case MyEnum.Value1: return 1;
        case MyEnum.Value2: return 2;
        case MyEnum.Value3: return 3;
    }
}

public enum MyEnum
{
    Value1,
    Value2,
    Value3
}

我得到錯誤: "Not all code paths return a value" 我不明白switch語句怎么不能跳轉到指定的情況之一。

enum可以以某種方式為null嗎?

沒有什么可說的, myEnum的值將是其中一個值。

不要將枚舉誤認為是一組限制性的值。 它實際上只是一組命名的值。 例如,我可以用以下方法調用您的方法:

int x = Method((MyEnum) 127);

你想要那樣做什么? 如果您希望它拋出異常,您可以在默認情況下執行此操作:

switch (myEnum)
{
    case MyEnum.Value1: return 1;
    case MyEnum.Value2: return 2;
    case MyEnum.Value3: return 3;
    default: throw new ArgumentOutOfRangeException();
}

或者,如果要在switch語句之前執行其他工作,可以預先使用Enum.IsDefined 這有拳擊的缺點...有一些方法,但他們通常更多的工作......

樣品:

public int Method(MyEnum myEnum)
{
    if (!IsDefined(typeof(MyEnum), myEnum)
    {
        throw new ArgumentOutOfRangeException(...);
    }
    // Adjust as necessary, e.g. by adding 1 or whatever
    return (int) myEnum; 
}

這假設MyEnum的基礎值與您想要返回的值之間存在明顯的關系。

枚舉不限於它們代表的值。 您可以指定:

MyEnum v = (MyEnum)1000;

而且根本沒有問題。 為您的交換機添加默認值,您將處理所有可能的情況。

如果更改枚舉中的值(添加第四個),代碼將會中斷。 您應該在switch語句中添加default:case。

當然,實現這一目標的另一種方法是在枚舉中定義整數值...

public enum MyEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

然后在代碼中將枚舉轉換為int。 而不是int myInt = Method(myEnumValue); 你可以使用int myInt = (int)myEnum

MyEnum blah = 0;

默認值始終為0並且可以隱式轉換,即使您沒有值為0的默認值也是如此。

它必須是:

public int Method(MyEnum myEnum)
{
    switch (myEnum)
    {
        case MyEnum.Value1: return 1;
        case MyEnum.Value2: return 2;
        case MyEnum.Value3: return 3;
        default: return 0;
    }
}

要么:

public int Method(MyEnum myEnum)
{
    switch (myEnum)
    {
        case MyEnum.Value1: return 1;
        case MyEnum.Value2: return 2;
        case MyEnum.Value3: return 3;
    }

    return 0;
}

暫無
暫無

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

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