c#切换问题

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

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’

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

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

请指教。

谢谢。

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

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

 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,这使生活变得更加容易。 我相信这对于这样的事情(以及hex解析/格式化)来说很好,但是当你冒险进入更奇特的场景时它会失败。 然后,对于许多代码简化技术来说都是如此……如果它们被不恰当地应用,你最终会陷入混乱。

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

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

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

您需要在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(); } 

您正在根据某些条件为变量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 } 

这样你的代码就不会太复杂,或者你不需要抛出或处理任何exception或类似的东西。

希望有帮助:)。

编译器无法知道变量x只能包含最多9个数字(这是您在switch检查的数字)。 由于您的交换机缺少default情况,因此alphaChar 可能会保持未分配状态。 您可以添加default大小写,也可以在switch之前为变量赋值。

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

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

您可以将其指定为“A”或“0”或几乎任何东西。

你可以在这样的声明中做到这一点

 char alphaChar = 'A'; 

或者你可以单独做

 char alphaChar; alphaChar = 'A';