【问题标题】:Switch statement: Not all code paths return a valueSwitch 语句:并非所有代码路径都返回值
【发布时间】:2012-08-15 04:23:03
【问题描述】:

我有一个枚举定义如下:

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 语句明确涵盖所有四种情况时,为什么会出现此错误(红色、白色、蓝色、绿色)

【问题讨论】:

    标签: c# switch-statement


    【解决方案1】:

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

    【讨论】:

    • 那么在 switch 语句中总是需要 default 吗?
    • 有趣.... ) 函数末尾的 default 不是必需的。
    • 不,这不是必需的。但是,总是必须有一条非处理值可以走的路径。这是因为编译器真的不检查枚举的值。例如,您可以像 toString((CrystalTypeEnum)666) 这样调用您的方法,它仍然可以编译。因此,您需要一个默认路径,或将编译的 switch 语句之外的代码。
    • 返回void表示不需要返回值,'return;'是隐含的,因此没有错误。
    • 我明白了...编译器真的没有抱怨 switch 语句没有涵盖所有值,而是抱怨 function 没有涵盖所有情况(缺少返回声明)。
    【解决方案2】:

    您需要指定一个默认部分。

    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
    } 
    

    【讨论】:

    • 为什么我需要在涵盖所有 4 种情况时指定默认值。永远不会到达默认语句,编译器可能无论如何都会删除它。
    • 我会返回什么?空值?我不喜欢我必须明确返回 null 的事实,即使它永远不会发生。那好吧。 :D
    • default 并不总是必需的,但在您的情况下,该函数期望所有代码路径都返回一个值,并且该开关允许绕过这 4 种情况。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      当我的 switch 语句明确涵盖所有四种情况(红色、白色、蓝色、绿色)时,为什么会出现此错误。

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

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

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

      不,您可以将 return 语句放在整个 switch 子句之后,或者只要“所有代码路径都返回一个值”即可。

      【讨论】:

      • 实际上,有 4,294,967,296 个案例(如果包括 default:,则为 4,294,967,297 个)。枚举成员只是某些值的方便文本表示。枚举变量可以具有基础类型允许的任何值(默认为 int)。
      【解决方案5】:

      我知道 asstander 发布的答案可能是您正在寻找的,但是有一种优雅的方法可以做到这一点,不需要任何 switch 语句。

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

      【讨论】:

      • 我不知道该怎么做。 :(
      • 发布的每个答案旁边都应该有一个“复选标记”。只需点击它,答案就会被接受。
      • 如果我只做 type.ToString(); 会怎样?
      • Enum.ToString() 也应该适合您。参考:msdn.microsoft.com/en-us/library/a0h36syw.aspx
      • 如果您对接受一个答案感到难过,您可以投票支持其他人,因此您也可以对那里的努力做出一些公正的评价。希望你知道,如何做到这一点:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多