13

私はクラスの1つで実装IComparableしています。null 引数が指定された場合に、それぞれの場合IComprable<T>にメソッドがどのように動作するかについての推奨事項はありますか? CompareTo正の数を返すか、それともスローする必要がありArgumentNullExceptionますか? または、この動作は実装クラスによって異なりますか?

MSDN のドキュメント ( hereおよびhere ) を見ましたが、この件については何も述べていません。どんな助けでも大歓迎です。

4

3 に答える 3

14

Both MSDN references for IComparable.CompareTo() and IComparable<T>.CompareTo() state the following:

By definition, any object compares greater than (or follows) Nothing, and two null references compare equal to each other.

Nothing in VB corresponds to null in C#.

Note that the previous paragraph states:

The meaning of the comparisons, "less than," "equal to," and "greater than," depends on the particular implementation.

But instance references that aren't null are always greater than null references, no matter how you compare instances of your class.

于 2011-12-27T07:25:32.683 に答える
12

MSDN のドキュメントを見ましたが、この件に関して何も言うことはありません

はい、そうですが、あまり明確ではありません。ドキュメントには次のように記載されています。

定義により、すべてのオブジェクトは Nothing よりも大きい (または Nothing に続く) と比較され、2 つの null 参照は互いに等しいと比較されます。

ドキュメントは、C# (null) と VB (Nothing) のイディオムが同じ文に混在しているため、混乱を招きます。私はそれを文書管理者に言及します。

同じ規則が null 許容値型に適用されることに注意してください。たとえば、null 許容整数のリストを並べ替える場合、1 は並べ替えのために null より大きいと見なされます。気をつけて; これは、C# で既定で null 許容整数を比較する方法ではありません。

于 2011-12-27T07:26:35.957 に答える
8

Object.ReferenceEqualsに渡された引数CompareToが nullかどうかをテストするために必ず使用してください。==メソッドでand!=演算子を使用しないでくださいCompareTo。MSDN の提案に従って、これらの演算子をCompareToメソッドに委譲する人が実際にいるかもしれません。その結果、無限ループとスタック オーバーフロー (!) が発生する可能性があります。

CompareToメソッドを実装しようとする場合のモデルを次に示します。

public class Piano : IComparable<Piano>
{
    public float Mark { get; set; }

    public int CompareTo(Piano other)
    {
        // The very basic implementation of CompareTo

        if (object.ReferenceEquals(other, null))
            return 1;   // All instances are greater than null

        return Mark.CompareTo(other.Mark);
    }
}

このアドレスに関する説明付きのソースコード全体。

于 2013-05-12T23:46:21.373 に答える