每次跳出都没有抛出异常

本文关键字:抛出异常 | 更新日期: 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)

您是否使用了调试器来查看究竟发生了什么?将查询从循环表达式中取出,并查看其中包含的内容。