首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >foreach跳出而不抛出异常

问foreach跳出而不抛出异常
EN

Stack Overflow用户
提问于 2011-12-15 03:51:55
回答 2查看 92关注 0票数 1

这个'foreach‘代码将停止工作,看起来是由于一些错误。但是,不会抛出异常。有什么好的理由吗?循环中的代码(即注释所在的位置)永远不会到达。失败是在枚举时发生的。

代码语言:javascript
复制
foreach (DeviceOption<int> d in _deviceOptions.Where(d => d.HasChanges))
{
    //Call some DAL method
}

如果这是等式的一部分,下面是'DeviceOption‘类代码:

代码语言:javascript
复制
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或或等的派生类型。

下面是更新后的代码以及我是如何修复无效类型转换的:

代码语言:javascript
复制
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 );
        }
EN

回答 2

Stack Overflow用户

发布于 2011-12-15 03:54:55

似乎没有HasChanges为True的设备选项。在这种情况下,Where扩展方法会产生一个空的enumerable。

票数 1
EN

Stack Overflow用户

发布于 2011-12-15 03:55:17

好吧,考虑到您提供的信息,我不得不假设这个查询返回一个空的enumerable:

代码语言:javascript
复制
_deviceOptions.Where(d => d.HasChanges)

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8510754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档