每次跳出都没有抛出异常
本文关键字:抛出异常 | 更新日期: 2023-09-27 18:17:48
这个'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是一个List,并且包含派生类型,如DeviceOption或or等。通过将此添加到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 );
}
似乎没有设备选项,其中HasChanges
为True。在这种情况下,Where
扩展方法产生一个空枚举对象。
根据您提供的信息,我必须假设这个查询返回一个空的可枚举对象:
_deviceOptions.Where(d => d.HasChanges)
您是否使用了调试器来查看究竟发生了什么?将查询从循环表达式中取出,并查看其中包含的内容。