Sobrecarga del método obteniendo una sobrecarga incorrecta

Tengo un problema para convencer a Visual Studio y al compilador de usar la sobrecarga del método correcto, posiblemente debido a la herencia.

Dados estos objetos:

Public Class Matrix
...
End Class

Public Class Vector
Inherits Matrix
...
End Class

existen dos métodos en un módulo:

Public Function Add(vector1 as Vector, vector2 as Vector) as Vector
...
End Function

Public Function Add(matrix1 as Matrix, matrix2 as Matrix) as Matrix
...
End Function

Sin embargo, cuando llamo explícitamente a Add() en dos objetos Vector, obtengo una InvalidCastException porque Vector no se puede convertir a Matrix para usar la encarnación Matrix de la función. Tenía la impresión de que el compilador intentaría usar el método más específico posible, por lo tanto, para estos argumentos, use el método Vector. Además, si hubiera alguna ambigüedad, el compilador los detectaría y proporcionaría un error.

  1. ¿Es este comportamiento según las especificaciones?
  2. ¿Es posible forzar el uso del método Vector? He intentado emitir ambos argumentos, pero como ya están dimensionados como vectores, no tiene ningún efecto.

Editar: Código de llamada solicitado

Tenga en cuenta que los dos métodos Add están en el mismo módulo matemático, es decir

Public Module Math
    Public Function Add(vector1 as Vector, vector2 as Vector) as Vector
    ...
    End Function

    Public Function Add(matrix1 as Matrix, matrix2 as Matrix) as Matrix
    ...
    End Function

    Public Function Subtract(ByVal vector1 As Vector, ByVal vector2 As Vector) As Vector
        Return Add(vector1, -vector2)
    End Function
End Module

preguntado el 03 de mayo de 12 a las 21:05

¿Puede mostrar un ejemplo del código que llama a Add(). Puede ser un problema con cómo se declaran las variables. -

Agregué el código de llamada para ti. El único vínculo entre las dos clases es a través de la herencia. -

Disculpas, corregí el código de llamada a lo que realmente estaba causando el problema y, al hacerlo, encontré mi error. El operador de negación había perdido su sobrecarga, por lo que -vector2 estaba volviendo a su operador de negación base Matrix. -

1 Respuestas

Respuestas:

  1. No, no es; Probablemente tenga más de un objeto de tipo Vector o Matrix definido en su proyecto. Es por eso que está recibiendo InvalidCastException.
  2. No es necesario.

contestado el 03 de mayo de 12 a las 22:05

No estoy seguro de cómo podría ser esto, ya que los objetos con el mismo nombre en el mismo espacio de nombres causarían errores de compilación y si hubiera varios espacios de nombres en el proyecto con el mismo objeto, entonces la forma en que se hace referencia a ellos tendría que importarse. una colisión de espacio de nombres. - collins j

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.