2011-12-08 11 views
1

私はここでナッツをやっています。私は以下のような機能を持っています。オブジェクトを返すことができません。私はリストで渡すことができます、私はQuickWatchに表示することができますx.RB = theRb少なくとも1つのリストの項目は、まだそれはループを終了しません(リターンを介して)。ループは続行されます。GenericsとEnumsの奇妙な平等問題?

私が渡しているリストは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 

これが機能しない理由についてのご意見やご提案はありますか?

If (x.RB.Equals(theRb)) Then Return x 
+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 CInt(x.RB)=CInt(theRb) Then Return x 
+0

私は同意すると、 '= '演算子はジェネリックで期待どおりに動作しない可能性があります。 – ja72

+0

ありがとう...素晴らしい提案。彼らは問題のアイテムと同等ですが、返品はありません。サイコロはありません。 – Mike

0

あなたはInteger型に列挙型をキャストして比較することができます:

+0

良いアイデア。私は両側で1を得るが、Returnには移動しない。 – 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