Сравнение экземпляра версии .Net с помощью CompareTo не работает должным образом.

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

Вопрос

Класс Version в .Net не реализует интерфейс CompareTo, как я ожидал; похоже, он обрабатывает сравнение буквенно-цифровым способом, а не сравнивает четыре числа.Возможно, это не ошибка, а «фича».

Может ли кто-нибудь пролить свет на то, почему сравнение (а также стандартные операторы <, = и >) не работают так, как я ожидал ниже?

    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 < 1.1.5000.

Это было полезно?

Решение

Нет, он сравнивает четыре части, рассматривая каждую как число.Какое число больше:5 или 3251?Наверняка это 3251.Поэтому версия 1.1.3251.* является «более новой» (т.е.больше), чем 1.1.5.*.

Если версия 1.1.3251 предшествует версии 1.1.5, то вы фактически используете одно число (часть «сборки») в виде последовательности цифр.Это ошибка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top