Il confronto dell'istanza della versione .Net con CompareTo non funziona come previsto
Domanda
La classe Version in .Net non implementa l'interfaccia CompareTo come mi aspetterei, sembra gestire il confronto alfanumerico invece di confrontare i quattro numeri. Forse non un bug, ma una "caratteristica".
Qualcuno può far luce sul perché il confronto (e anche gli operatori < ;, = e >) standard non funzionano come mi aspetterei di seguito?
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()))
So che le persone hanno fatto le loro soluzioni manuali per questo, mi piacerebbe sapere se questo è di progettazione o dovrebbe funzionare e potrei fare qualcosa di stupido.
Grazie in anticipo
Ryan
Aggiornamento: stavo facendo qualcosa di leggermente stupido e trattarli nello stesso modo degli indirizzi IP. Per esempio; 1.1.3023.5364 è maggiore di 1.1.5 ma 1.1.3023.5364 è & Lt; di 1.1.5000.
Soluzione
No, sta confrontando le quattro parti, trattandole come un numero. Qual è il numero più grande: 5 o 3251? Sicuramente è 3251. Pertanto la versione 1.1.3251. * È & Quot; più recente & Quot; (ovvero maggiore) di 1.1.5. *.
Se hai 1.1.3251 in arrivo prima della 1.1.5, allora stai effettivamente usando un singolo numero (la " build " parte) come una sequenza di cifre. Questo è un errore.