2

リフレクションを使用して、実行時に2つの値を比較したいと思います。これにはComparer.Default.Compare(x、y)を使用していましたが、これでは不十分であることに気付きました。ダブルとシングルを比較したいとしましょう(1.0 == 10)。Comparer.Defaultは、両方の値が同じタイプ(double)でなければならないと主張するため、例外をスローします。ただし、これには明示的な変換が存在します。これは、実際に使用したいものです。

では、なぜConvert.ChangeTypeだけを使用できないのでしょうか。1.25> 1(double> integer)の場合を考えてみましょう。1.25でConvert.ChangeType(1.25、typeof(int))を試してみると、1が得られ、実際に1.25 IS> 1の場合、上記のアサーションは失敗します。

それで、誰かがタイプが定義する明示的な比較(存在する場合)を呼び出す方法を提案できますか?

ありがとう。

4

2 に答える 2

5

C#4と.NET 4を使用していますか?もしそうなら、動的型付けを使用するのは本当に簡単です:

dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever

コンパイラは、適切な変換をすべて実行します。

于 2010-09-21T15:36:37.477 に答える
1

C#4がオプションである場合、動的を使用するというJonSkeetの提案がおそらく理想的です。

そうでない場合は、...

明示的な比較はありません。コンパイラは、コンパイル時に変換を実行してから、適切な比較を呼び出します。

最善の策は、Convert.ChangeTypeを使用してより広いタイプに変換し、結果を比較することです。すべてのタイプのチェックを処理したくない場合は、通常、両側を値に変換してから、すべての値を適切に処理する必要がdecimalあるため、単一の比較を使用してそれらをチェックできます。decimal

于 2010-09-21T15:37:12.780 に答える