我正在使用int.TryParse
来解析变量(在数据库中保存为字符串),我很好奇为什么我不能初始化2个变量:
int min,
max;
使用以下条件语句:
bool lengthCompatible = int.TryParse(string1, out min) &&
int.TryParse(string2, out max);
Visual Studio(2015)生成以下代码突出显示:
使用未分配的本地变量' max'
本地变量' max'在访问
之前可能未初始化
但是,如果我使用2个条件语句:
bool minParse = int.TryParse(sentenceType.MinimumLength, out min);
bool maxParse = int.TryParse(sentenceType.MaximumLength, out max);
我可以编译而没有错误。
Curiouser和curiouser!任何洞察力都赞赏。
干杯
答案 0 :(得分:6)
您正在使用&&
短路...如果int.TryParse(string1, out min)
返回false
,则不会再次拨打int.TryParse
,所以max
没有明确分配。
你可以写:
if (int.TryParse(string1, out min) &&
int.TryParse(string2, out max))
{
// Use min and max here
}
...因为编译器知道如果两个调用都已执行,你只能到达if
语句的主体。
或者,您可以使用&
代替&&
的非短路版本:
bool lengthCompatible = int.TryParse(string1, out min) &
int.TryParse(string2, out max);
虽然这有点不寻常。上述if
版本的优势在于您将保留&&
的性能优势,因为如果您不需要,您将无需尝试解析string2
。 (当然,这取决于你正在尝试做什么。)
答案 1 :(得分:1)
因为如果第一个int.TryParse(string1, out min)
返回false,则由于布尔短路而不会执行第二个int.TryParse(string2, out max)
。
在这种情况下,max
将不会被初始化。
您可以将max
和min
初始化为零:
int min = 0,
max = 0;
...
bool lengthCompatible = int.TryParse(string1, out min) && int.TryParse(string2, out max);
或者仅在根据其他答案检查max
的结果后才使用min
和&&
。
答案 2 :(得分:0)
这称为快捷方式布尔评估。这样可以确保仅在找到最终结果之前评估布尔表达式。
如果第一个int.TryParse(string1, out min)
已经存在,则第二个将不会被执行,因为整体结果已经是false
。因此,max
变量不能保证始终初始化。