1

2 つのオブジェクト型変数を受け取り、CompareTo() メソッドを実行する静的メソッドがあります。

public static int Compare(Object objA, Object objB)
{
   return (((IComparable)objA).CompareTo(objB));
}

問題は、異なる型 (int と double など) を比較しようとすると、CompareTo() が例外をスローすることです。2 つの異なる型を比較す​​るために、C# でより良い方法を知っている人はいますか? または、この問題の回避策はありますか?

ありがとう

4

5 に答える 5

2

一般的な解決策がないため、C# でその問題を解決する一般的な方法はありません。情報が失われない場合、C# コンパイラは暗黙的に型を別の型に変換して比較します。それ以外の場合は、例外がスローされます。

この例では、IComplarableインターフェイスの実装を作成したプログラマーが 2 つのオブジェクトが比較可能かどうかを判断する責任があり、クラスのユーザーであるあなたはそれに影響を与えません。

于 2010-03-08T10:36:25.253 に答える
1

これを行うには、独自のロジックを作成する必要があります。これは、基本的な比較が何をすべきかを知っているのは自分だけだからです。

たとえば、例を挙げて比較します

int i = 10;
double d = 10.2;

これらは等しいですか?整数を double に昇格してから比較する必要がありますか? いいえ、等しくありません。
double を切り捨てて整数にする必要がありますか? はい、それらは等しいです。

静的メソッドでは、A と B の型が同じかどうかを確認する必要があります。同じ場合は、a.compareTo(b) を呼び出すことができます。

そうでない場合は、さまざまなタイプを比較する方法を決定し、そのソリューションを静的メソッドに実装する必要があります。

お役に立てれば

于 2010-03-08T10:53:00.473 に答える
1

IComparable<T>考えられる回避策は、リフレクションを介してインターフェースを使用することです。

public static int Compare(Object objA, Object objB)
{
    Type comparableType = typeof(IComparable<>).MakeGenericType(objA.GetType());
    MethodInfo compareMethod = comparableType.GetMethod("CompareTo");
    return (int)compareMethod.Invoke(objA, new[] { objB });
}

ただし、これは遅くなり、objB の型を objA の型に変換できる場合にのみ機能します。

于 2010-03-08T10:45:09.767 に答える
1

数値のみで作業している場合は、これを使用して Nenad で説明されている問題の回避策を提供できます。

public static int Compare(Object objA, Object objB)
{
    object objB_as_AType = System.Convert.ChangeType(objB, objA.GetType());
    return (((IComparable)objA).CompareTo(objB_as_AType));
}

ただし、 A がチェックなしで IComparable であると想定しているため、非常に注意してください。関連する型が相互に変換されることを保証する必要があります。

于 2010-03-08T10:46:47.673 に答える
0

数値のみを比較している場合、これはほとんどの場合に機能します。

public static int Compare(Object objA, Object objB) 
{ 
   return (((IComparable)Convert.ToDouble(objA)).CompareTo(Convert.ToDouble(objB))); 
} 
于 2010-03-08T10:50:50.127 に答える