2011-12-14 54 views
1

這'foreach'的代碼將退出工作,它似乎是由於一些錯誤。但是,不會拋出異常。有沒有什麼好的理由?永遠不會達到INSIDE循環中的代碼(即註釋的位置)。失敗是枚舉時。foreach跳出沒有例外拋出

foreach (DeviceOption<int> d in _deviceOptions.Where(d => d.HasChanges)) 
{ 
    //Call some DAL method 
} 

在情況下,這是方程的一部分,這是 'DeviceOption' 類代碼:

public class DeviceOption 
{ 
    private object _state; 
    public object State 
    { 
     get { return _state; } 
     set 
     { 
      if (_state == value) 
      { 
       return; 
      } 
      HasChanges = true; 
      _state = value; 
     } 
    } 
    public bool UserEditable { get; set; } 
    public DateTime Timestamp { get; set; } 
    public int UserId { get; set; } 
    public bool HasChanges { get; set; } 
    public bool IsNew { get; set; } 
    public Guid ID { get; set; } 
    public string DisplayCategory { get; set; } 
    public string Name { get; set; } 

} 
public class DeviceOption<T> : DeviceOption where T : IComparable 
{ 
    private T _value; 

    public T Value 
    { 
     get { return _value; } 
     set 
     { 
      if (value.CompareTo(_value) == 0) { return; } 

      HasChanges = true; 
      OriginalValue = _value; 
      _value = value; 
     } 
    } 

    public T OriginalValue { get; set; } 

}` 

更新:我想通了這一點。 我明白了這一點。結果發現一個無效的演員正在發生,代碼是錯誤的。奇怪的是,這個例外沒有被拋出。我現在知道這一點,因爲我在try/catch中包裝了代碼。行爲就像這段代碼在單獨的線程上運行一樣。那是LINQ的工作原理嗎?

的原因鑄是因爲_deviceOptions是一個列表,幷包含派生類型,如DeviceOption或或等通過添加該到LINQ,東西現在都很好:「& & d是DeviceOption」

這裏是更新後的代碼,我怎麼固定了無效的轉換:

try 
     { 

      foreach(DeviceOption<int> d in _deviceOptions.Where(d => d.HasChanges && d is DeviceOption<int>)) 
      { 
       //blah blah blah 
      } 



     } 
     catch(Exception ex) 
     { 
      //this is how I detected the exception. Don't ask why I didn't think of this before :(
      Console.Write(ex.Message); 
     } 
+2

那麼它會什麼都不做,如果只是沒有變化的設備.. – BrokenGlass 2011-12-14 19:54:43

回答

1

看來,沒有設備選項,其中HasChanges爲True。在這種情況下,Where擴展方法會產生一個空的枚舉。

0

好了,給你提供的信息,我不得不假定該查詢返回一個空的枚舉:

_deviceOptions.Where(d => d.HasChanges) 

你用調試器在所有知道到底是怎麼回事?將查詢拉出循環表達式並查看它包含的內容。