Pregunta

La clase Version en .Net no implementa la interfaz CompareTo como esperaría, parece manejar la comparación alfanuméricamente en lugar de comparar los cuatro números. Tal vez no sea un error, sino una 'característica'.

¿Alguien puede aclarar por qué los operadores de comparación (y también el estándar < ;, = y >) no funcionan como esperaría a continuación?

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

Sé que la gente ha hecho sus propias soluciones manuales para esto, me gustaría saber si esto es por diseño o debería funcionar y podría estar haciendo algo tonto.

Gracias de antemano

Ryan

Actualización: estaba haciendo algo sutilmente tonto y tratarlos de la misma manera era como direcciones IP. Por ejemplo; 1.1.3023.5364 es mayor que 1.1.5 pero 1.1.3023.5364 es & Lt; que 1.1.5000.

¿Fue útil?

Solución

No, está comparando las cuatro partes, tratando cada una como un número. ¿Cuál es el número más grande: 5 o 3251? Seguramente es 3251. Por lo tanto, la versión 1.1.3251. * Es & Quot; newer & Quot; (es decir, mayor) que 1.1.5. *.

Si tienes 1.1.3251 antes de 1.1.5, entonces estás usando efectivamente un solo número (la parte " build ") como una secuencia de dígitos. Eso es un error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top