sustitucion sistemas sistema reduccion primer para metodos metodo lineales igualacion grado eliminacion ecuaciones cramer 2x2 c# f# interop overloading override

c# - reduccion - metodos para resolver sistemas de ecuaciones lineales



No se puede resolver un método F#que se haya invalidado y sobrecargado desde C# (1)

Sin duda, es consciente de que si omite el miembro Test(x,y) del tipo Descendant , o simplemente le cambia el nombre a Test2(x,y) , entonces el código C # se compilará y ejecutará como se espera.

Mirar el IL generado para su tipo de Descendant original ofrece una pista:

.method public hidebysig virtual instance int32 Test ( int32 x ) cil managed ... .method public instance int32 Test ( int32 x, int32 y ) cil managed ...

Observe que no hay hidebysig atributo hidebysig en el método Test(x,y) .

La especificación ECMA CLI tiene lo siguiente que decir acerca de hidebysig . (Sección 15.4.2.2, el énfasis en negrita es mío).

hidebysig se suministra para el uso de herramientas y es ignorado por VES. Especifica que el método declarado oculta todos los métodos de los tipos de clase base que tienen una firma de método coincidente; cuando se omite, el método debe ocultar todos los métodos del mismo nombre, independientemente de la firma .

Por lo tanto, el compilador F # omite el atributo hidebysig , lo que significa que el método Test(x,y) oculta todos los otros métodos llamados Test . Aunque hidebysig es solo "para el uso de herramientas", ¡parece que el compilador de C # es una de esas herramientas que lo usa!

Me parece que podría ser un error en el compilador de F #, pero como nunca he visto la especificación de F #, siempre es posible que este sea un comportamiento permitido / especificado.

El siguiente código F # declara las clases base y descendiente. La clase base tiene un método virtual ''Prueba'' con una implementación predeterminada. La clase descendiente anula el método de la clase base y también agrega un nuevo método de ''Prueba'' sobrecargado. Este código compila bien y no presenta problemas al acceder a uno de los métodos de "Prueba" descendientes.

Código F #:

module OverrideTest [<AbstractClass>] type Base() = abstract member Test : int -> int default this.Test x = x + 1 type Descendant() = inherit Base() override this.Test x = x - 1 member this.Test (x, y) = x - y

Sin embargo, al intentar invocar la anulación de ''Prueba'' del descendiente desde C # se produce un error de compilación:

resultado var = td.Test (3); <- Sin sobrecarga para el método ''Test'' toma 1 argumentos

El código completo de C #:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Client { class Program { static void Main(string[] args) { var td = new OverrideTest.Descendant(); var result = td.Test(3); Console.WriteLine(result); Console.ReadKey(); } } }

Lo extraño es que la inteligencia de VisualStudio ve las dos funciones sobrecargadas y proporciona las firmas correctas para ambas. No emite advertencias ni errores antes de que falle la compilación, y solo resalta la línea después.

He vuelto a implementar este escenario completamente en C # y no encontré el mismo problema.

¿Alguien tiene alguna idea de lo que está pasando aquí?