2016-09-15 9 views
0

短絡状態に少し問題がありました。配列にほぼ2つのインデックスがあるか、文字列が特定の値と等しいかどうかを確認して問題を再現します。この:短絡状態が失敗する

string[] favItem = new string[] { "hello", "world", "test", "foo" }; 
string temp = "hello"; 
var itemToRemove = temp.Split(','); 

foreach(var fav in favItem) 
{ 
    if(fav == "foo" || (itemToRemove.Length > 1 & fav == itemToRemove[0] || fav == itemToRemove[1])) 
    { 
    //do something 
    } 
} 

はとても基本的に私は私が反復でfav値を比較する必要がyesの場合itemToRemove配列は、ほぼ2インデックスを持っているかどうかを確認する必要があり、これが失敗した場合、デフォルト値でfavを比較する必要があり、 2つのインデックスはitemToRemoveです。

今すぐitemToRemoveで唯一のインデックスがあると仮定し、私はこれを終了することはできませんよ。&で特に

(itemToRemove.Length > 1 & fav == itemToRemove[0] || fav == itemToRemove[1]) 

私は、「インデックスが上がらない場合の条件を終了しようとしています2つ。デバッグモードで

は、私がブレークポイントと false値を見ることができますが、コードの秋に、なぜ私は理解していない:

OutOfRangeException

itemToRemove[1]とのときのままにする必要があります調子。

私は間違っていますか?

+1

一般的な経験則では、 'bool'ロジックを扱うときに、短絡していない演算子'& 'と' | 'を使うことはほとんどありません。 – juharr

答えて

4

あなたのコードは2つの問題があります。

まず、短絡ブールの "and"演算子は&&です。 &はビットと演算子であり、短絡しません。

第2に、||よりも優先度が高いため、(itemToRemove.Length > 1 && (fav == itemToRemove[0] || fav == itemToRemove[1]))のように2番目の||をまとめてグループ化する必要があります。経験則を覚えておくと、and0 && 1 = 0のような乗算で、orはのようになります。

+0

ありがとう、うまくいきます:) – Unchained

関連する問題