2017-06-06 100 views
3

我使用int.TryParse來分析變量(保存在數據庫中的字符串),並很好奇,爲什麼我不能初始化兩個變量:使用以下條件語句爲什麼int.TryParse不能初始化多個變量

int min, 
    max; 

bool lengthCompatible = int.TryParse(string1, out min) && 
         int.TryParse(string2, out max); 

的Visual Studio(2015)產生以下代碼高亮:

使用未分配的局部變量的「最大」

局部變量「最大」可能無法訪問之前被初始化

不過,如果我使用2個條件語句:

bool minParse = int.TryParse(sentenceType.MinimumLength, out min); 
bool maxParse = int.TryParse(sentenceType.MaximumLength, out max); 

我可以編譯沒有錯誤。

Curiouser and curiouser!任何洞察讚賞。

乾杯

+0

因爲min可能會失敗,最大不會啓動 – BugFinder

+1

&&操作符使用短路評估。因此,第二次TryParse調用可能不會執行,並且max不會有值。改用&運算符。 –

回答

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

因爲如果第一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變量不保證始終被初始化。