c#切换问题

时间:2009-12-27 16:28:49

标签: c# switch-statement unassigned-variable

我是编程新手并遇到以下代码问题:

    private string alphaCoords(Int32 x)
    {
        char alphaChar;

        switch (x)
        {
            case 0: alphaChar = 'A'; break;
            case 1: alphaChar = 'B'; break;
            case 2: alphaChar = 'C'; break;
            case 3: alphaChar = 'D'; break;
            case 4: alphaChar = 'E'; break;
            case 5: alphaChar = 'F'; break;
            case 6: alphaChar = 'G'; break;
            case 7: alphaChar = 'H'; break;
            case 8: alphaChar = 'I'; break;
            case 9: alphaChar = 'J'; break;
        }

        return alphaChar.ToString();
    }

编译器说:使用未分配的局部变量'alphaChar'

但是我正在我的交换机块中分配它。

我确信这是我的错,因为我对编程知之甚少。

请告知。

感谢。

8 个答案:

答案 0 :(得分:35)

如果 x为0-9,则指定。如果x是123,你会期望它做什么?虽然可能知道只传入0到9之间的值,但编译器不会 - 所以需要考虑否则会发生什么。

避免这种情况的一种方法是在switch语句中使用default大小写,如果该值不在预期范围内,您可以使用它来抛出异常:

switch (x)
{
    case 0: alphaChar = 'A'; break;
    case 1: alphaChar = 'B'; break;
    case 2: alphaChar = 'C'; break;
    case 3: alphaChar = 'D'; break;
    case 4: alphaChar = 'E'; break;
    case 5: alphaChar = 'F'; break;
    case 6: alphaChar = 'G'; break;
    case 7: alphaChar = 'H'; break;
    case 8: alphaChar = 'I'; break;
    case 9: alphaChar = 'J'; break;
    default: throw new ArgumentOutOfRangeException();
}

这是一个稍微简单的替代方案,它会完全删除你的switch语句:

if (x < 0 || x > 9)
{
    throw new ArgumentOutOfRangeException();
}
char alphaChar = (char)('A' + x);

请注意,在使用像这样的算术时需要小心。在Java和C#中,底层表示保证是Unicode,这使生活变得更容易。我相信它对于这样的事情(以及十六进制解析/格式化)来说很好,但是当你冒险进入更奇特的场景时它会失败。然后,对于许多代码简化技术来说都是如此......如果它们被不恰当地应用,你最终会陷入混乱。

答案 1 :(得分:2)

您需要在switch语句中添加默认值。

编译器声明在某些情况下不会为变量赋值。所以添加

default:
  alphaChar = 'x'
break;

将告诉编译器“所以,如果我错过了一些场景,请将值设为”

或在不想分配默认值的情况下:

  default: throw new Exception();

这不一定更好,但另一种方式:

 private string alphaCoords(Int32 x)
    {
      if(x >= 0 && x =< 9)
           return ((char)(x + 65)).ToString();
      else
        throw new ArgumentException();
    }

答案 2 :(得分:2)

编译器抱怨,因为alphaChar 可能未定义 - 如果它不是switch中的某个值,那么它将不会被定义。您可以执行以下操作之一:

  • 设置char的初始值,如果没有任何切换条件为真,将执行该操作。
  • 在switch语句中添加“default”子句。

答案 3 :(得分:2)

在首次使用之前,必须明确分配局部变量(根据C#规范规则)。在这种特殊情况下,switch构造不保证alphaChar将被明确分配,因此编译器错误。您可以为alphaChar提供初始值,因此它将被明确分配。

答案 4 :(得分:1)

您正在根据某些条件为变量alphaChar分配值。想象一下,变量x包含0到9之外的值的场景。假设它包含10.那么x不会满足任何条件条件,因此不会分配alphaChar任何价值,因此它将完全未初始化。因此,当您将alphaChar转换为字符串时,它会将一些垃圾值转换为字符串并将其返回给调用方法。这就是您收到该消息的原因。

如果您想获得一个简单的解决方案,请在下面添加以下代码

case 9: alphaChar = 'J'; 
        break; 

-

default: return null;

并检查调用方法,这个alphaCoords函数是否返回null,如下所示 -

if(alphaCooord(10) == null)
{
    // x contains value other than 0 to 9
}
else
{
    // x contains value between 0 to 9, so the returned value will be the string
    // representation of the corresponding character
}

通过这种方式,您的代码不会太复杂,或者您不需要抛出或处理任何异常或类似的东西。

希望有帮助:)。

答案 5 :(得分:0)

编译器无法知道变量x只能包含最多9个数字(这是您在switch中检查的数字)。由于您的交换机中缺少default案例,因此{em>可以发生alphaChar仍然未分配。您可以添加default个案例,也可以在switch之前为变量指定一个值。

答案 6 :(得分:0)

为您的开关添加默认值,因为如果x为10,则永远不会分配alphaChar。

答案 7 :(得分:0)

声明变量char alphaChar之后,你应该为它“赋值”一个值(将它设置为等于某个值),即使你希望它在switch语句中得到一个值。

你可以指定'A'或'0'或几乎任何东西。

你可以在这样的宣言中做到这一点

char alphaChar = 'A';

或者您可以单独进行

char alphaChar;    
alphaChar = 'A';