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í?