2011-08-06 16 views
2

嘿所以我有這個代碼,我檢查一下玩家是否可以從他們的庫存中刪除一個'Item'。 'Inventory'是一個Sorted Dictionary(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

編譯器不會試圖理解邏輯 - 它只是應用規則。至於它而言,它有可能是for循環執行倍,因此中間塊缺少一個返回值:

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 
    } 

事實上,這是正確的在這一點 - 作爲一個邪惡malcontent可以編寫一個Count()方法,返回不同的值,每個調用(或者提供一個不太邪惡的場景 - 線程競賽/數據變化)。

也許最簡單的 「修復」 這裏是改變:

else 
    { 
     return temp; 
    } 

簡單:

return temp; 

那麼它將適用於所有分支機構。

+0

ohhh我看到的兩種方法來訪問它們!那麼你會建議我怎樣解決這個錯誤?我確實把if語句用來防止for循環發生,但我明白你的意思。是否會處理該事件的一段代碼?像'for'循環的'else'代碼塊一樣? – Kartik

+0

@Kartik刷新我的建議 –

+0

所以這裏就是我所做的......我預見到的唯一問題是它會經歷庫存中的所有項目,並且temp的值會一遍又一遍地改變,直到它完成整個庫存。基本上它只會在用戶試圖刪除庫存的最後一個項目時纔會返回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 (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; 

推理:如果Count()爲0,for循環將永遠不會被執行,因此你永遠不會raturn。雖然這可能不太可能(畢竟,你會檢查Count是否大於0)。編譯器無法確定,因爲可以在if-check和for循環之間修改Count()。編譯器無法確定這一點(請參閱「Halting Problem」)

相關問題