2013-04-09 39 views
2

這是相當簡單的方法。我使用entity framework來獲取一些數據,然後檢查if statement中的一些值。但是現在該方法被標記爲紅色。C#錯誤 - 「不是所有的代碼路徑都返回一個值」

這是我的方法:

private bool IsSoleInProduction(long? shoeLastID) 
{ 
    if (shoeLastID == null) 
    { 
     MessageBox.Show(Resources.ERROR_SAVE, 
         "Error", 
         MessageBoxButtons.OK, 
         MessageBoxIcon.Error); 
     return false; 
    } 

    ISoleService soleService = 
     UnityDependencyResolver.Instance.GetService<ISoleService>(); 

    List<Sole> entity = 
     soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList(); 

    if (entity.Count() != 0) 
    { 
     foreach (var items in entity) 
     { 
      if (items.Status == 20) 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
    } 
    else 
    { 
     return false; 
    }  
} 

我缺少什麼?

+0

您是否在修改答案後修改了代碼?上面的代碼應該可以工作。 – 2013-04-09 07:06:47

+0

不會檢查列表的第一個元素嗎?我認爲你只需要一個返回false後 – Sayse 2013-04-09 07:10:26

回答

7

你需要利用LINQ與An Y,更換你的代碼

return entity.Any(item => item.Status == 20); 

甚至更​​好的性能:

return soleService.All() 
       .Any(s => s.ShoeLastID == shoeLastID 
        && s.Status == 20); 

編輯:隨着你對此有何評論,下面的代碼是你所需要的:

List<Sole> entity = soleService.All() 
          .FirstOrDefault(s => s.ShoeLastID == shoeLastID); 

    return entity == null ? false : entity.Status == 20; 
+1

使用linq的版本不等於原來的,如果在列表的開始處有Status!= 20的項目,則返回false。 – 2013-04-09 07:16:21

+0

@ josef.axa:不,如果一個項目的狀態== 20,如果沒有,將會返回,直到找到。你需要運行這段代碼才能看到 – 2013-04-09 07:19:40

+0

@ josef.axa這是一個很好的保存。等效版本將如下所示:return(soleService.All()。First(s => s.ShoeLastID == shoeLastID).Status == 20) – 2013-04-09 07:21:06

3

如果您的entity集合中沒有項目,那麼將不會執行包含if/else分支。在這種情況下,不再有任何退貨聲明,因爲else部分將不會執行,並且在您的foreach之外,您沒有退貨聲明。

2

你還沒有從這個代碼塊

if (entity.Count() != 0) 
      { 
       foreach (var items in entity) 
       { 
        if (items.Status == 20) 
        { 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
       // return someting 
      } 
0

retrun什麼如果實體集沒有任何元素,你將不會達到return語句 - 你需要添加return false forexample作爲最後的陳述

0

由於錯誤狀態可能會出現這樣的情況,即您的返回子句沒有被評估(例如,如果列表中沒有元素)。 要快速解決它,您可以放置​​一個默認返回語句,例如通過移動else語句之外的最後一個return子句。但是這取決於你期望的行爲。

private bool IsSoleInProduction(long? shoeLastID) 
     { 
      if (shoeLastID == null) 
      { 
       MessageBox.Show(Resources.ERROR_SAVE, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
       return false; 
      } 
      ISoleService soleService = UnityDependencyResolver.Instance.GetService<ISoleService>(); 
      List<Sole> entity = soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList(); 

      if (entity.Count() != 0) 
      { 
       foreach (var items in entity) 
       { 
        if (items.Status == 20) 
        { 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
      } 
      return false; 
     } 
0

編譯器不能保證到Count第一次調用意味着,foreach將循環至少一次(有很好的理由,因爲你可以,如果你願意,創建一個集合,其中,這是不正確的)。你可以(而無需外部if)做到這一點,而不是:用簡單的代碼

if (entity.Count() != 0) 
{ 
    foreach (var items in entity) 
    { 
     if (items.Status == 20) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 
else 
{ 
    return false; 
}  

foreach (var items in entity) 
{ 
    if (items.Status == 20) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

return false; 
1

什麼將是你entity.Count()0和你entity沒有任何items

這意味着您的if塊將起作用,但foreach部分不起作用。由於您的if部件沒有任何退貨聲明,所以您會收到錯誤。

你應該在你的if部分放置return語句。

if (entity.Count() != 0) 
{ 
    foreach (var items in entity) 
    { 
     if (items.Status == 20) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    //return true or false 
} 
1

您可能會考慮執行以下操作。這將堅持「single exit-point」的原則(這有時可以幫助提高代碼的清晰度),並確保您在任何情況下,默認值:

private bool IsSoleInProduction(long? shoeLastID) 
{ 
    // The main change: A default value, assuming "no": 
    var isSoleInProduction = false; 

    if (shoeLastID == null) 
    { 
     MessageBox.Show(Resources.ERROR_SAVE, 
         "Error", 
         MessageBoxButtons.OK, 
         MessageBoxIcon.Error); 
     isSoleInProduction = false; 
    } 

    ISoleService soleService = 
     UnityDependencyResolver.Instance.GetService<ISoleService>(); 

    List<Sole> entity = 
     soleService.All().Where(s => s.ShoeLastID == shoeLastID).ToList(); 

    if (entity.Count() != 0) 
    { 
     foreach (var items in entity) 
     { 
      if (items.Status == 20) 
      { 
       isSoleInProduction = true; 
      } 
      else 
      { 
       isSoleInProduction = false; 
      } 
     } 
    } 
    else 
    { 
     isSoleInProduction = false; 
    }  

    return isSoleInProduction; 
} 
3

編譯器不「看」,如果

entity.Count() != 0 

那麼你的循環

foreach (var items in entity) 

將至少運行一次。因此它看到了運行forech零次的可能性,並且沒有運行else塊。

假設第一次entity列舉了,它會產生一些(有限數量)的項目。那麼Count將是非零。那麼假設下一次同一entity被枚舉然後它不會產生任何項目!這會導致你的代碼「沒有返回」。

很可能您可以保證源在每次重新枚舉時都會生成相同數量的項目。但編譯器不能。

解決方案:只需跳過if (entity.Count() != 0)並做foreach馬上。

相關問題