2011-12-08 1 views
1

나는 여기에 견과류가 될 것 같습니다. 나는 다음과 같은 기능을 가지고있다. 그것은 물건을 돌려주지 못합니다. 내가 목록에 전달할 수 있습니다, 나는 QuickWatch에서 그 목록에있는 항목 중 적어도 하나에 대해 x.RB = theRb을 볼 수 있습니다. 그러나 리턴 (return)을 통해 루프를 종료하지는 않습니다. 루프가 계속됩니다.제네릭 및 열거 형에 이상한 평등 문제가 있습니까?

전달할 목록은 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 

왜 이것이 작동하지 않는지에 대한 제안이나 아이디어?

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

+1 '너는 여기에 가겠다.'너는 단 한사람 만 ... 언제 금요일에? – JonH

+0

그들이 "평등하다"는 것을 어떻게 알 수 있습니까? 그들은 어떤 유형입니까? – Oded

+0

QuickWatch에서 x.RB 및 theRb의 값을 확인합니다. 둘 다 같은 가치를 보여줍니다. QuickWatch에서 x.RB = theRB의 값을 표시합니다. 그것은 True를 보여줍니다. 그 이상으로 시험 할 수있는 것이 있습니까? – Mike

답변

0

내가 해상도를 가지고 있습니다. 나는 그것을 완전히 설명 할 수는 없다.

전달할 항목 목록은 aXXX 클래스의 하위 클래스입니다. 하위 클래스가/Overrides/Shadows이라는 기본 클래스의 RB 속성을 올바르게 재정의하지 않았습니다. 이 종류가 인 경우 QuickWatch가 일치 항목에서 True를 표시하는 이유에 대한 설명을 제공합니다. 아마도이 하위 클래스 속성이 테스트에 포함 된 "실제"속성 값을 숨기고있는 것일 수 있습니다.

어쨌든 서브 클래스의 속성을 모두 함께 가져 오거나 Overloads을 추가하면 For Each는 예상대로 동작합니다. 나는 원래의 Linq 버전으로 돌아갈 수있다.

내 생각에이 부분은 감독/실수 코딩으로 추측됩니다. 그러나이 문제는 QuickWatch가 "오 탐지"를보고한다는 사실에 의해 거의 가려졌습니다!

제안과 도움을 주신 모든 분들께 감사드립니다.

1

나는 노력 추천 할 것입니다?

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

'='연산자가 제네릭과 함께 예상대로 작동하지 않을 수도 있습니다. – ja72

+0

감사 ... 좋은 제안. 그들은 문제의 항목과 동일하지만 아직 돌아 오지 않습니다. 주사위가 없다. – Mike

0

당신은 정수로 열거 캐스팅하고 비교할 수 있습니다

+0

좋은 아이디어. 나는 양쪽면 모두 1 점을 얻지 만 리턴으로 이동하지는 않습니다. 감사합니다. – Mike

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

. 이것은 내가 원래 가지고있는 Linq 질의와 비슷하다. 나는 당신이 "OrDefault"부분을 사용할 수 있다고 지적하고 있습니다. 그러나 현재의 경우 일치하는 것이 있습니다. Linq 쿼리를 For Each로 바꿨으므로 값을 반복 할 때 검사 할 수있었습니다. – Mike

관련 문제