Comparer l'instance de version .Net à l'aide de CompareTo ne fonctionne pas comme prévu
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.
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.