2013-06-10 161 views
11

与えられたオブジェクトがnullの場合、CompareToメソッドで返されるものは何ですか?Override CompareTo:nullの場合はどうすればいいですか?

MSDN Libraryは、1が返される例を示します。しかし、私はnullと比較することができないので、私はエラーを投げることを期待していたでしょう。

私はこの回答に異なる意見を期待しています。ベストプラクティスアプローチは何ができますか?

+1

nullと比較して「不可能」とはどういう意味ですか?すべての参照型をnullと正常に比較することができます。それ以外の場合は、[Nullableクラス](http://msdn.microsoft.com/en-us/library/system.nullable.aspx)でラップすることができます。 – Renan

+0

"異なる意見を期待する"なら、これはスタックオーバーフローには適していません。なぜなら、FAQには主観的な質問を避けるべきであるという明確な統計があるからです。 –

+1

この例は有効です。 CompareToはオブジェクトのソート順を返すので、nullを最初の要素 – NoviceProgrammer

答えて

22

はい、ベストプラクティスがあります。他の回答が言っていることとは対照的に、最も一般的な行動ではなく、期待される基準があります。正解をIComparable<T>.CompareToIComparable.CompareToためのMSDNドキュメントに記載されている

定義により、任意のオブジェクトは、ヌルより大きい比較、および2つのヌル 参照は互いに等しいです。

(契約上は、より大きな比較は次のように定義される:。a > b次いでa.CompareTo(b) > 0場合)

この予想される動作はまたNullable.Compare<T>、例えば裏付けています。 Nullは常に値より小さい値として比較されます。

パラメータ、OBJは、クラスまたは値型の と同じ型でなければなりません:

また、非ジェネリックは比較のために、不整合のタイプがヌルとして扱われるべきではないということは注目に値しますこのインタフェースを実装しています。それ以外の場合、ArgumentExceptionは です。


これは、あなたの質問に影響を与えますが、注意して、Nullable<T> comparison operators==!=<<=>>=は)IComparable大会に従っていませんしません。

NULL可能なタイプの1 の値がnullであり、他は、!=(等しくない)を除きfalseに評価 すべての比較ではない場合は、NULL可能なタイプとの比較を行います。 は、特定の比較がfalseを返すため、 の逆のケースはtrueを返します。次の例では、10は ではなく、より小さい、またはより小さい値ではありません。 num1 != num2 のみがtrueと評価されます。

(int?)null == (int?)nullがtrueと評価されたが、(int?)null <= (int?)nullないという奇妙な結果もあります。

2

あなたの選択はあなたのものです。私が何かを何も比較しないで、「何か」をより大きく見せたいという有効なユースケースを想像することは、可能性の領域を超えていません。しかしそれがあなたがそれを上書きする理由です。そのため、あなたはそのケースをどのように処理するかを決めることができます。

1

ベストプラクティスは、特定のケースによって異なります。比較するオブジェクトによっては、nullと比較することができます。

nullが任意の比較の可能な限り低い値になるようにオブジェクトを定義すると、明らかにnullとの比較が可能であり、明確な結果が得られます。他のケースでは、例外をスローする方が意味があるかもしれません。

最終的に、これは必ずしも1つの答えではない設計思想(かなり主観的)です。

-1

nullの引数を持つCompareToは、nullの項目を含むリストをソートする場合に影響します。指定されたオブジェクトがnullのときに1を返すと、ソート時にリストの上にnullが表示されますが、これが最も一般的な動作です。

関連する問題