Pergunta

A classe Versão em .Net não implementa a interface CompareTo como seria de esperar, parece para lidar com a comparar alfanumérica em vez de comparar os quatro números. Talvez não um bug, mas um 'recurso'.

Alguém pode brilhar uma luz sobre o porquê do comparar (e também o padrão <, = e> operadores) não funcionam como seria de esperar abaixo?

    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()))

Eu sei que as pessoas têm feito suas próprias soluções manuais para isso, eu gostaria de saber se isso é por design ou ele deve funcionar e eu poderia estar fazendo algo estúpido.

Agradecemos antecipadamente

Ryan

Update: eu estava fazendo algo sutilmente mudo e tratá-los da mesma era como endereços IP. Por exemplo; 1.1.3023.5364 é maior do que 1.1.5 mas 1.1.3023.5364 é

Foi útil?

Solução

Não, ele está comparando as quatro partes, tratando cada um como um número. Que é o número maior: 5 ou 3251? Certamente é 3251. Portanto versão 1.1.3251. * É "mais recente" (ou seja maior) do que 1.1.5. *.

Se você tem 1.1.3251 vindo antes 1.1.5, então você está efetivamente usando um número único (a parte "construir") como uma seqüência de dígitos. Isso é um erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top