2011-08-06 10 views
2

こんにちは、このコードは、プレイヤーが在庫からアイテムを取り除くことができるかどうか確認する場所です。 'Inventory'はソートされたディクショナリ(Item、int)です(サブクエリ:インデックス番号付きのアイテムにアクセスするためにソートされたディクショナリが必要ですか?)、Itemはクラスです。C#:すべてのコードパスが値と到達不能コードを返すわけではありませんか?

 public bool CanRemoveFromItemInventory(string item) 
    { 
     bool temp = false; 
     if (ItemInventory.Count() <= 0) 
     { 
      return false; 
     } 
     else if (ItemInventory.Count() > 0) 
     { 
      for (int b = 0; b < ItemInventory.Count(); b++) 
      { 
       Item i = ItemInventory.Keys.ElementAt(b); 
       if (i.GetName().Equals(item) && ItemInventory[i] >= 1) 
       { 
        temp = true; 
       } 
       else 
       { 
        temp = false; 
       } 

       if (!temp) 
       { 
        return false; 
       } 
       else 
       { 
        return true; 
       } 
      } 
     } 
     else 
     { 
      return temp; 

     } 
    } 
+0

サブ質問については、辞書はどうですか? – sternr

+0

Tさんはどういう意味ですか? – Kartik

+0

保存したいオブジェクトのタイプ - 正しく理解していれば、オブジェクトをint型コード – sternr

答えて

6

コンパイラは論理を理解しようとせず、ルールを適用するだけです。 - 悪として

else if (ItemInventory.Count() > 0) 
    { 
     for (int b = 0; b < ItemInventory.Count(); b++) 
     { 
       // ... this always returns something 
     } 
     // BUT STILL NEED TO EITHER RETURN OR THROW HERE 
    } 

は確かに、それはこの中に正しい:限り、それが関係しているように、forループは、従って中間ブロックが戻り値が欠落している、ゼロ回実行することが可能です不公平はCount()メソッドを書くことができ、はそれぞれを呼び出す(または、悪いシナリオを提示する - スレッド競合/データ突然変異)異なる値を返すことがあります。

おそらく最も簡単な、ここで "修正" に変更することです:

else 
    { 
     return temp; 
    } 

を単純に:

return temp; 

それは、すべての枝に適用されます。

+0

ohhh i see!だから私はこのエラーを修正するために何を提案しますか? forループが起こるのを防ぐためにif thenステートメントを入れましたが、あなたが何を意味するのかを見ています。そのイベントを処理するコードがありますか? 'for'ループの 'else'コードブロックと同様? – Kartik

+0

私の提案のために@Kartikリフレッシュ –

+0

これは私がやったことです...私が予見している唯一の問題は、それが在庫のすべてのアイテムを通過し、一時的な値が何度も何度も変化することですインベントリ全体で行われます。基本的には、ユーザーがインベントリの最後の項目を削除しようとした場合にのみtrueを返します。 – Kartik

2

forループの後に、returnステートメントが存在しないことをコンパイラが認識しています。コンパイラは、コードパスがforループを決して残さない(または入力することはない)ことを証明できないため、ループの後のいつかreturnステートメントをヒットすることを期待しています。ただし、そのパスにはreturnステートメントがありません。

到達不能なコードエラーについては、それが不平を言っている行にコメントを追加する必要があります。


更新:

public bool CanRemoveFromItemInventory(string item) 
{ 
    var pair = ItemInventory.FirstOrDefault(pair => pair.Key.GetName() == item); 

    return pair != null && pair.Value >= 1; 
} 

インベントリリストの最初の項目はあなたがアイテムでない場合は、コードの現在のバージョンは失敗します。それは、あなたがこのような何かのために行っているように見えます探している。つまり、コンパイラのエラーを修正しても、コードは正しく機能しません。

+0

ああ、forループのb ++の行に起きているのですが、 – Kartik

+0

@ Kartik:forループの最後にreturn文があるので、ループは実際には条件付きです。あなたはいつも戻るので、複数回実行してください。私は私の答えを更新するつもりです。 – cdhowie

2

forループの外でリターンを置く:

for (int b = 0; b < ItemInventory.Count(); b++) { 
    Item i = ItemInventory.Keys.ElementAt(b); 
    if (i.GetName().Equals(item) && ItemInventory[i] >= 1) { 
     temp = true; 
     break; 
    } 
} 
return temp; 

推論:カウント()はforループの実行されないだろうので、あなたがraturn決して、0である場合。これはおそらくありえないかもしれませんが(結局のところ、Countが0より大きいかどうかチェックします)。 Count()はif-checkとforループの間で変更できるため、コンパイラはそれを判別できません。コンパイラでこれを判別できません(Halting Problemを参照)

関連する問題