El siguiente código F # declara clases base y descendientes. 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 "Test" sobrecargado. Este código compila bien y no presenta problemas al acceder a cualquiera de los métodos descendientes de 'Prueba'.No se puede resolver un método F # que ha sido anulado y sobrecargado desde C#
F # Código:
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, intentar invocar anulación del descendiente de 'prueba' de C# da como resultado un error de compilación:
var result = td.Test(3); <- No overload for method 'Test' takes 1 arguments
El total de C# Código:
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 Intellisense de VisualStudio ve las dos funciones sobrecargadas y proporciona s firmas correctas para ambos. No da advertencias o errores antes de que la construcción falle, y solo resalta la línea después.
He vuelto a implementar este escenario completamente en C# y no tuve el mismo problema.
¿Alguien tiene alguna idea de lo que está pasando aquí?
¿Ha comparado el IL emitido en ambos idiomas? – Oded
¿Qué sucede si en el código C# subiste a la clase base antes de llamar al método? – Brian
@Brian: Eso funciona. – Daniel