0

基本的に2つのオブジェクトでCompareToを呼び出すヘルパー関数がありますが、特別なコーナーケースのチェック、変換などを行います。

もともと私はそのように関数を書きました:

public static bool BetterCompare(IComparable lhs, IComparable rhs, out retCode)
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

しかし、問題は、私が持っている場合ですclass AwesomeClass : IComparable<AwesomeClass>。実際、いくつかの古いIComparableクラスがなくなったので、私はいくつか持っていIComparable<T>ます。しかし、コンパイラはこれらの新しいオブジェクトをに変換できないため、怒りますIComparable。これが悪化するかどうかはわかりませんが、そのうちのいくつかは悪化していますabstract(抽象クラ​​スは実装を提供しますが)。

「CompareToを呼び出すことができる2つのオブジェクトが必要」を伝え、コンパイラにリップを与えないようにするにはどうすればよいですか。できれば、新しい関数はのようBetterCompare<AwesomeClass>(this, that, out retCode);に見えるのではなく、単に「正しいことをする」必要があります。または、すべてのクラスに触れずにこれを行うためのより良い方法はあります IComparableIComparable<T>

4

4 に答える 4

9

非ジェネリックインターフェイスと同様にAwesomeClass実装するか、ジェネリックメソッドを作成することができます。IComparableIComparable<T>BetterCompare

public static bool BetterCompare<T>(T lhs, T rhs, out retCode)
    where T : IComparable<T>
{
    ...
    retCode = lhs.CompareTo(rhs);
    ...
}

(これは既存の方法と共存できることに注意してください。)

于 2009-07-02T16:18:40.057 に答える
0

いつでも変数をオブジェクトタイプに変更し、リフレクションを使用して、それらがインターフェイスの1つを実装しているかどうかを確認し、正しいインターフェイスにキャストすることができます。

注:反射は非常に遅いので、注意して使用してください。

于 2009-07-02T16:23:33.350 に答える
0

との両方をComparer<T>実装するを見て、適切な場所でそれを使用することができます。ただし、コードのリファクタリングが必要になる場合があります。IComparer<T>IComparer

于 2009-07-02T16:24:25.083 に答える
0

ドキュメントには次のように書かれています。

Defaultプロパティによって返されるオブジェクトは、System.Collections.Generic.IComparable<T>汎用インターフェイスを使用して2つのオブジェクトを比較します。IComparable<T>タイプTがジェネリックインターフェイスを実装していない場合、DefaultプロパティはインターフェイスComparer<T>を使用するaを返しSystem.Collections.IComparableます。

于 2009-07-02T16:34:40.530 に答える