CompareToを使用した.Netバージョンインスタンスの比較が期待どおりに機能しない

StackOverflow https://stackoverflow.com/questions/317084

質問

.NetのVersionクラスは、期待どおりCompareToインターフェイスを実装していません。4つの数値を比較するのではなく、英数字の比較を処理しているようです。たぶんバグではなく、「機能」です。

比較(および標準の<!> lt;、=および<!> gt;演算子)が以下で期待するように機能しない理由について、誰もが光を当てることができますか?

    Dim MainVersion As New Version("1.1.3251.4029")
    Dim Ver_Low As New Version("1.1")
    Dim Ver_Same As New Version("1.1.3251.4029")
    Dim Ver_High As New Version("1.1.5.0")

    ' CompareTo here yields 1 which is expected as MainVersion is greater than Ver_Low.
    MessageBox.Show(String.Format("{0}.CompareTo({1}) = {2}", MainVersion.ToString(), Ver_Low.ToString(), MainVersion.CompareTo(Ver_Low).ToString()))

    ' CompareTo here yields 0 which is expected as MainVersion and Ver_Same are the same.
    MessageBox.Show(String.Format("{0}.CompareTo({1}) = {2}", MainVersion.ToString(), Ver_Same.ToString(), MainVersion.CompareTo(Ver_Same).ToString()))

    ' **** Issue here **** CompareTo here yields 1 which is NOT expected as MainVersion is less than Ver_High.
    MessageBox.Show(String.Format("{0}.CompareTo({1}) = {2}", MainVersion.ToString(), Ver_High.ToString(), MainVersion.CompareTo(Ver_High).ToString()))

このために人々が自分で手動で回避策を講じたことは知っていますが、これが仕様によるものか、それが機能するか、そして何かおかしいことをしているのかどうかを知りたいです

事前に感謝

ライアン

更新:私は微妙に愚かなことをしていて、それらをIPアドレスと同じように扱っていました。例えば; 1.1.3023.5364は1.1.5よりも大きいですが、1.1.3023.5364は<!> ltです。 1.1.5000未満。

役に立ちましたか?

解決

いいえ、4つの部分を比較し、それぞれを数字として扱います。 どちらが大きいですか:5または3251?確かに3251です。 したがって、バージョン1.1.3251。*は<!> quot; newer <!> quot;です。 (つまり、より大きい)1.1.5。*。

1.1.5の前に1.1.3251を取得している場合、数字のシーケンスとして単一の数字(<!> quot; build <!> quot;部分)を効果的に使用しています。それは間違いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top