X.Single((c)=> c是[type])不起作用

时间:2011-07-29 14:53:10

标签: .net .net-3.5 typechecking

我有一个List< Component>集合(Component是一个自定义类),其中单个元素继承自XTYPE。

但由于某些原因,这不起作用:

X = (XTYPE)Components.Single((c) => c is XTYPE);

我收到一条InvalidOperationException,消息“Sequence contains no matching element” 但是,如果我在该行放置断点并执行此操作,则返回true

Components[0] is XTYPE

此外,如果我这样做,则返回true

Components[0].GetType().BaseType.BaseType == typeof(XTYPE)

帮助。


确定,所以我在代码中添加了一些检查...

        foreach (Component c in Components)
            Console.WriteLine(c.GetType().BaseType.BaseType == typeof(Bridge));
        if (Components.Count == 0)
            throw new Exception("No components");
        if (!(Components[0].GetType().BaseType.BaseType == typeof(Bridge)))
            throw new Exception("Not bridge.");

False被写入控制台,但类型名称相同。 这可能是DLL地狱。现在需要一组信息来回答这个问题。

我认为你们帮助我走向了解决方案。


进一步说明:有问题的组件是通过来自其中包含XTYPE的DLL的单独实例的反射来实例化的。所以现在我们有两个XTYPE,但它们在技术上并不是同一类型,因为它们有一个diff类型的句柄。

调试器没有检查正确的上下文,所以它认为类型是相同的。但这是错误的。

2 个答案:

答案 0 :(得分:1)

如果多个元素满足条件,则

Single抛出。如果您只希望其中一个使用First。但由于您的更新声明错误是“序列不包含匹配元素”First对您没有帮助。

您可以考虑使用OfType。这对您的问题没有帮助,但使代码更好一些。并且防止您在演员阵容中使用与支票中不同的类型。

XTYPE x=Components.OfType<XTYPE>().Single();

其他一些可能的原因:

  • 您在即时模式下使用了不同的Components。因此代码正在处理的集合是空的,您在立即模式中引用的集合包含元素
  • 集合实现被破坏,即索引器和枚举器不一致。但是,因为你可能正在谈论框架本身的Components实现,这是不太可能的。
  • 您要投放的类型与您正在检查的类型不同
  • 你做了一些非法的多线程并破坏了一些状态

答案 1 :(得分:1)

有问题的组件是通过来自其中包含XTYPE的DLL的单独实例的反射来实例化的。所以现在我们有两个XTYPE,但它们在技术上并不是同一类型,因为它们有一个diff类型的句柄。

调试器没有检查正确的上下文,所以它认为类型是相同的。但这是错误的。