[英]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.