这个'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或或等的派生类型。
下面是更新后的代码以及我是如何修复无效类型转换的:
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 );
}发布于 2011-12-15 03:54:55
似乎没有HasChanges为True的设备选项。在这种情况下,Where扩展方法会产生一个空的enumerable。
发布于 2011-12-15 03:55:17
好吧,考虑到您提供的信息,我不得不假设这个查询返回一个空的enumerable:
_deviceOptions.Where(d => d.HasChanges)您是否使用过调试器来查看到底发生了什么?将查询从循环表达式中提取出来,并查看其中包含的内容。
https://stackoverflow.com/questions/8510754
复制相似问题