我的问题不是如何解决这个错误(我已经解决了),但为什么这个错误的布尔值。
我的功能是
private string NumberToString(int number, bool flag)
{
string str;
switch(flag)
{
case true:
str = number.ToString("00");
break;
case false:
str = number.ToString("0000");
break;
}
return str;
}
错误是Use of unassigned local variable 'str'
。布尔只能是真或假。因此,在任何一种情况下都会填充str
。那为什么会出现这个错误?
此外,如果伴随着真假的情况我会添加一个default
的情况,这个错误就消失了,但是仍然可以将bool与真假分开吗?
为什么bool变量有这种奇怪的行为?
答案 0 :(得分:9)
在布尔变量上写一个switch语句对我来说似乎有些讨厌。为什么不使用条件运算符(?:
):
private string NumberToString(int number, bool flag)
{
return flag ? number.ToString("00") : number.ToString("0000");
}
代码似乎更简洁,您不需要局部变量。
但回到你的问题为什么你的代码不编译=>这是因为必须始终分配变量,并且这种赋值不应该发生在条件语句中。
答案 1 :(得分:6)
您得到的错误是string
变量和不 boolean
可能的值。
没有办法没有cases
运行的事实是真的(在这种情况下),但编译器在分析代码方面并没有这么做。它只是查看未在某些条件下分配和使用的变量,并且没有默认值,因此假设 可能在某些情况下仍然未分配。
答案 2 :(得分:4)
我想,你试图问,为什么str
变量是未分配的,因为switch语句的情况会为它赋予一些值,但是编译器无法确定它是否会落入任何case语句中,这就是你在返回str
时收到此错误的原因。
如果你添加一个带字符串赋值的默认情况,那么编译器肯定会知道str会保留一些值,这就是你没有得到错误的原因
答案 3 :(得分:3)
private string NumberToString(int number, bool flag)
{
string str = "";
switch(flag)
{
case true:
str = number.ToString("00");
break;
case false:
str = number.ToString("0000");
break;
}
return str;
}
写这个 string str = "";
- 您应该分配值
如果添加默认情况,则无法分配切换案例。现在是
答案 4 :(得分:0)
嗯,对于这个问题的原因有很好的解释,但还有一个问题的解决方案,没有提到。只需添加default
而不是第二个case
:
private string NumberToString(int number, bool flag)
{
string str;
switch (flag)
{
case true:
str = number.ToString("00");
break;
default:
str = number.ToString("0000");
break;
}
return str;
}
由于我们始终在flag
语句中分配default
值,因此编译器不会对switch
变量值有任何进一步的想法。
还要考虑if-else语句等效解决方案:
private string NumberToString(int number, bool flag)
{
string str;
if (flag)
str = number.ToString("00");
else
str = number.ToString("0000");
return str;
}
我不是特别喜欢'one-liners'(单行解决方案),因为它们缺乏可扩展性而且还具有可读性,但作为最后的手段,只使用这样的三元运算符:
private string NumberToString(int number, bool flag)
{
return flag ? number.ToString("00") : number.ToString("0000");
}
当我在它时 - 考虑使用扩展方法+默认布尔值到false
,例如:
public static class intExtensions
{
public static string NumberToString(this int number, bool flag = false)
{
return flag ? number.ToString("00") : number.ToString("0000");
}
}
然后在主要课程中:
int intVal = 56;
string strVal1 = intVal.NumberToString(true);
string strVal2 = intVal.NumberToString();