Comparer l'instance de version .Net à l'aide de CompareTo ne fonctionne pas comme prévu

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

Question

La classe Version dans .Net n'implémente pas l'interface CompareTo comme je le pensais, elle semble gérer la comparaison de manière alphanumérique au lieu de comparer les quatre nombres. Peut-être pas un bug, mais une "fonctionnalité".

Quelqu'un peut-il expliquer pourquoi les opérateurs de comparaison (ainsi que les opérateurs < ;, = et > standard) ne fonctionnent pas comme prévu?

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

Je sais que les gens ont créé leurs propres solutions manuelles, j'aimerais savoir si cela est voulu ou si cela devrait fonctionner et je pourrais faire quelque chose de stupide.

Merci d'avance

Ryan

Mise à jour: je faisais quelque chose de subtilement idiot et je les traitais de la même manière que les adresses IP. Par exemple; 1.1.3023.5364 est supérieur à 1.1.5 mais 1.1.3023.5364 est & Lt; que 1.1.5000.

Était-ce utile?

La solution

Non, il compare les quatre parties, en les traitant chacune comme un nombre. Quel est le plus grand nombre: 5 ou 3251? C'est sûrement 3251. Par conséquent, la version 1.1.3251. * Est & Quot; newer & Quot; (c'est-à-dire supérieur) à 1.1.5. *.

Si la version 1.1.3251 arrive avant la version 1.1.5, vous utilisez en fait un seul numéro (la partie & "Build &";) en tant que séquence de chiffres. C'est une erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top