我是编程新手并遇到以下代码问题:
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'
但是我正在我的交换机块中分配它。
我确信这是我的错,因为我对编程知之甚少。
请告知。
感谢。
答案 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
中的某个值,那么它将不会被定义。您可以执行以下操作之一:
答案 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';