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

5

我正在使用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);

我可以编译而没有错误。

越来越好奇了!任何见解都会受到赞赏。

干杯


因为最小值可能失败,所以最大值甚至不会启动。 - BugFinder
1
&& 操作符使用短路求值。因此,第二个 TryParse 调用可能不会执行,而 max 将没有值。请改用 & 操作符。 - Hans Passant
3个回答

7

您正在使用短路逻辑运算符&&...如果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
因为如果第一个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);

或者只需在检查&&的结果后使用maxmin,如其他答案所述。


0
这被称为快捷布尔运算。这确保布尔表达式仅在找到最终结果之前进行评估。
如果第一个 int.TryParse(string1, out min) 已经成功,那么第二个将不会被执行,因为总体结果已经是 false。因此,max 变量不能保证始终被初始化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接