Странная проблема равенства с Generics и Enums? - PullRequest
1 голос
/ 08 декабря 2011

Я тут схожу с ума.У меня есть функция что-то вроде следующего.Не удается вернуть объект.Я могу передать список, я вижу в 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 ]

1 голос
/ 09 декабря 2011

Я бы порекомендовал попробовать:

If (x.RB.Equals(theRb)) Then Return x
0 голосов
/ 09 декабря 2011

У меня есть разрешение. Я не могу полностью объяснить это, хотя.

Список предметов, которые я передаю, является подклассом класса aXXX. Подкласс неправильно переопределил свойство RB из базового класса - нет Overloads / Overrides / Shadows. Этот вид дает объяснение того, почему QuickWatch сообщает True о совпадении - может быть, это свойство подкласса скрывало значение «реального» свойства, которое было в тесте?

В любом случае, если все свойства в подклассе вынуть вместе или добавить Overloads, функция For Each ведет себя так, как и следовало ожидать. Я даже могу вернуться к исходной версии Linq, которая была у меня в функции.

Полагаю, это связано с недосмотром / неаккуратным кодированием с моей стороны. Но проблема была замаскирована тем, что QuickWatch сообщал о «ложных срабатываниях»!

Спасибо всем за предложения и помощь.

0 голосов
/ 09 декабря 2011

Я не уверен, как было написано ваше первоначальное утверждение, но это должно дать результат, который вы ищете:

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 голосов
/ 09 декабря 2011

Можете ли вы привести Enum к целому числу, а затем сравнить?

If CInt(x.RB)=CInt(theRb) Then Return x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...