Switch语句:并非所有代码路径都返回一个值

时间:2012-08-15 04:23:04

标签: c# switch-statement

我的枚举定义如下:

public enum CrystalTypeEnum { Red, White, Blue, Green };

我有一个静态函数,它返回给定枚举值的字符串表示形式:

public static string toString(CrystalTypeEnum type)
{
    switch (type)
    {
        case CrystalTypeEnum.Red:
            return "Red";
        case CrystalTypeEnum.White:
            return "White";
        case CrystalTypeEnum.Blue:
            return "Blue";
        case CrystalTypeEnum.Green:
            return "Green";
    }
}

编译代码时出现以下错误:

  

CrystalType.toString(CrystalType.CrystalTypeEnum):并非所有代码路径都返回值

为清楚我的switch语句涵盖了(红色,白色,蓝色,绿色)的所有四种情况,为什么会出现此错误。

5 个答案:

答案 0 :(得分:6)

您需要指定默认部分。

switch (type) 
{ 
    case CrystalTypeEnum.Red: 
        return "Red"; 
    case CrystalTypeEnum.White: 
        return "White"; 
    case CrystalTypeEnum.Blue: 
        return "Blue"; 
    case CrystalTypeEnum.Green: 
        return "Green"; 
    default:
        //return what you need here
} 

答案 1 :(得分:6)

如果没有default:控件被转移到switch语句之外(对于未由case处理的值)。这意味着如果你没有default:,那么在switch之后需要一个return语句,它返回由方法的返回类型定义的类型的值。

答案 2 :(得分:2)

  

为清楚我的switch语句涵盖了所有四种情况(红色,白色,蓝色,绿色),为什么会出现此错误。

因为总共有五个案例而不是四个案例。您可以将不是这些定义的枚举值之一的整数转换为CrystalTypeEnum类型,它仍然有效。

CrystalType.toString((CrystalTypeEnum)(42));
  

所以在switch语句中,总是需要默认值?

不,只要“所有代码路径都返回一个值”,就可以将return语句放在整个switch子句之后或其他任何内容。

答案 3 :(得分:2)

不要忘记在switch \ case构造中使用此部分:

switch (type) 
{
    default:
        throw new ArgumentException("Incorrect CrystalTypeEnum");
} 

答案 4 :(得分:1)

我知道旁观者发布的答案可能正是您所寻找的,但有一种方法可以做到这一点,不需要任何切换声明。

您可以使用Enum.GetName方法获取枚举值的字符串表示形式。 请阅读here