为什么int.TryParse无法初始化多个变量

时间:2017-06-06 09:23:55

标签: c# .net

我正在使用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!任何洞察力都赞赏。

干杯

3 个答案:

答案 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将不会被初始化。

您可以将maxmin初始化为零:

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变量不能保证始终初始化。