2011-12-08 39 views
1

我有點瘋了。我有一個像下面這樣的函數。它無法返回一個對象。我可以通過一個列表,我可以在QuickWatch中看到x.RB = theRb至少有一個列表中的項目,但它不會退出循環(通過返回)。循環繼續。泛型和枚舉的奇怪的平等問題?

我通過的列表是aXXX的子類。

屬性RB上一級aXXXRBEnum類型。

此外,我最初使用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 

任何建議或爲什麼這是不工作的想法?

+0

+1爲'我在這裏瘋了',你不是唯一一個......星期五是什麼時候? – JonH

+0

你怎麼知道他們是「平等的」?他們是什麼類型的? – Oded

+0

我檢查QuickWatch中x.RB和Rb的值。兩者顯示相同的價值。我在QuickWatch中顯示x.RB = theRB的值。它顯示爲真。除此之外還有什麼可以測試的嗎? – Mike

回答

0

我有分辨率。但我不能完全解釋它。

我傳入的項目列表是類aXXX的子類。該子類沒有正確覆蓋基類的RB屬性 - 沒有Overloads/Overrides/Shadows。這個種類的給出了爲什麼QuickWatch在匹配上報告True的解釋 - 也許這個子類屬性隱藏了測試中的「真實」屬性值?

無論如何,通過一起取出子類中的屬性或添加一個Overloads,For Each的行爲就像人們期望的那樣。我甚至可以回到我在函數中使用的原始Linq版本。

我想這歸結爲我的監督/馬虎編碼。但由於QuickWatch報告「誤報」,這個問題被掩蓋得很好!

感謝大家的建議和幫助。

1

我會建議您嘗試:

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

我同意,'='操作符可能無法像泛型一樣按預期工作。 – ja72

+0

謝謝...不錯的建議。它們對於所討論的物品是平等的,但是沒有返回。沒有骰子。 – Mike

0

,就可以把枚舉轉換成整數,然後比較?

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

好主意。我得到雙方1但不移動到回報。 – Mike

0

我不知道如何原來的where語句寫但這應該產生你要找的結果:

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 
+0

謝謝。這與我最初的Linq查詢類似。我知道你指出我可以使用「OrDefault」部分。然而,目前的情況是,這是一場比賽。 我用一個For Each替換了Linq查詢,所以我可以檢查它迭代的值。 – Mike