泛型和枚举的奇怪平等问题?

时间:2011-12-08 18:51:02

标签: vb.net generics enums

我有点疯狂。我有一个类似以下的功能。它没有返回一个对象。我可以传入一个列表,我可以在QuickWatch中看到列表中至少有一个项x.RB = theRb,但它不会退出循环(通过Return)。循环继续。

我传递的列表是aXXX的子类。

班级RB上的aXXX属性类型为RBEnum

另外,我最初使用Linq但是得到了“没有匹配的项目”例外。

Private Shared Function GetX(Of T As aXXX)(ByVal a As List(Of T), 
 ByVal theRb As RBEnum) As T

    For Each x As T In a
        If (x.RB = theRb) Then Return x
    Next

    Return Nothing

End Function

有关为什么不起作用的任何建议或想法?

4 个答案:

答案 0 :(得分:1)

我建议尝试:

If (x.RB.Equals(theRb)) Then Return x

答案 1 :(得分:0)

你可以将Enum转换为整数然后进行比较吗?

If CInt(x.RB)=CInt(theRb) Then Return x

答案 2 :(得分:0)

我不确定你的原始陈述是如何写的,但是这应该产生你正在寻找的结果:

Private Shared Function GetX(Of T As aXXX)(ByVal a As List(Of T), 
 ByVal theRb As RBEnum) As T

    Return a.Where(Function(x) x.RB = theRb).FirstOrDefault()

End Function

答案 3 :(得分:0)

我有决心。我不能完全解释它。

我传入的项目列表是aXXX类的子类。子类没有正确覆盖基类的RB属性 - 没有Overloads / Overrides / Shadows。这个类型的解释了为什么QuickWatch在匹配时报告True - 也许这个子类属性隐藏了测试中的“真实”属性值?

无论如何,通过一起取出子类中的属性或添加Overloads,For Each的行为就像人们期望的那样。我甚至可以回到我在函数中的原始Linq版本。

我想这归结为我的疏忽/草率编码。但QuickWatch报道“误报”这个问题很好地掩盖了这个问题!

感谢大家的建议和帮助。