2017-06-06 9 views
3

を初期化することはできませんなぜ私は、変数に解析するint.TryParseを使用しています(データベース内の文字列として保存された)、私は2つの変数初期化できない理由好奇心:以下の条件文を使用してint.TryParseは、複数の変数

int min, 
    max; 

を:

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

のVisual Studio(2015)次のコードの強調表示を生成します。

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

私が使用してコンパイルすることができます:私は2つの条件文を使用している場合

にアクセスするただし、前に割り当てられていないローカル変数のを使用するには、「最大」

ローカル変数「最大」は初期化されない可能性がありますエラーはありません。

Curiouser and curiouser!どんな洞察も高く評価されます。

乾杯

+0

minが失敗する可能性があるため、maxを起動しなくてもよいため、 – BugFinder

+1

&&演算子は短絡評価を使用します。したがって、2回目のTryParse呼び出しは実行されず、maxには値がありません。代わりに&演算子を使用します。 –

答えて

6

さてあなたは短絡である、&&を使用している... int.TryParse(string1, out min)戻りfalseint.TryParseへの2番目の呼び出しが行われない場合、その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)が偽ため、第二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になるため、2番目のメッセージは実行されません。したがって、max変数は常に初期化されるとは限りません。