Pregunta

Al convertir un proyecto (en el que se usó varias veces un método de plantilla de IComparable) de VS 2005 a VS 2008, tengo algunos errores:

Error 12 Type argument 'Object' does not inherit from or implement 
the constraint type 'System.IComparable'.

¿Es esto un hecho real que System.Object ya no implementa esa interfaz, o algo salió mal durante la conversión? ¿Puedo arreglar esto de alguna manera?

El problema es con el siguiente método:

Public Function ValueIn(Of T As IComparable)(ByVal pValue As T, ByVal ParamArray pArgs() As T) As Boolean
    For Each MyArg As T In pArgs
        If pValue.CompareTo(MyArg) = 0 Then
            Return True
        End If
    Next
    Return False
End Function

e incluso algo simple como:

Dim a as Object = 1
ValueIn(a,1,2)

provoca el error mencionado anteriormente. Funcionó perfectamente en VS 2005, entonces, ¿cuál puede ser el problema ahora?

¿Fue útil?

Solución

EDITAR: acabo de probar su código en VS 2005 y 2008.

Tiene la opción Option Strict Off configurada en su proyecto o archivo de código fuente. Su código nunca funcionó en primer lugar, y si configura Option Strict On en VS 2005, verá la causa real del error, que es " Error en la inferencia de argumento de tipo para el parámetro de tipo 'T '' '. Recomiendo que se use Option Strict On en todo el código VB.NET.

Usted ve un error diferente en VS 2008 porque está usando una versión más nueva del lenguaje, con reglas de inferencia de tipos y sobrecarga muy diferentes. En VB.NET 2008, el compilador no puede resolver la llamada al método independientemente de si Option Strict está activado o desactivado.

El tipo System.Object no implementa y nunca implementó ninguna interfaz.

La configuración de Option Infer en VS 2008 no es relevante para su código porque no utiliza ningún tipo inferido.

La forma más sencilla de corregir el error en ambos IDEs es cambiar el código de llamada así:

    Dim a As Integer = 1
    ValueIn(a, 1, 2)

Otros consejos

Si ejecuta la depuración del código en Visual Studio 2005, verá que a desde

Dim a como Object = 1

es un número entero pero si usa 2008 indicará que es un objeto.

Integer tiene la interfaz IComparable implementada pero no Object. ¿Entonces lo que hay que hacer? Respuesta: Obtuve las propiedades de los proyectos (haga clic con el botón derecho en el nombre del proyecto y seleccione las propiedades), vaya a 'Compilar' y allí ahora tiene, excepto lo explícito, estricto y comparar, que tenía en 2005, un nuevo campo llamado Inferir. Cambia ese valor.

Y ahora cruzamos nuestros dedos para que esto funcione.

System.Object fue IComparable? ¿Cómo funcionó eso? IEquatable, puedo entenderlo, pero IComparable no tiene sentido.

¿Se puede ampliar en " método de plantilla " ;? Tal vez eso sea una pista.

Estoy 99% seguro de que esto se debe a un cambio en .Net 3.5 con la clase de plantilla IComparable. He visto un par de ejemplos anteriores de .NET que funcionan bien pero generan errores en 3.5.

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