Il seguente codice F # dichiara classi di base e discendenti. La classe base ha un metodo virtuale 'Test' con un'implementazione predefinita. La classe discendente sovrascrive il metodo della classe base e aggiunge anche un nuovo metodo "Test" sovraccarico. Questo codice viene compilato correttamente e non presenta problemi durante l'accesso a uno dei metodi "Test" del discendente.Impossibile risolvere un metodo F # sovrascritto e sovraccaricato da C#
F # Codice:
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
Tuttavia, il tentativo di richiamare esclusione del discendente di 'Test' da C# i risultati in un errore di compilazione:
var result = td.Test(3); <- No overload for method 'Test' takes 1 arguments
La piena C# Codice:
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();
}
}
}
La cosa strana è che l'intellisense di VisualStudio vede le due funzioni sovraccariche e fornisce s firme corrette per entrambi. Non dà avvertimenti o errori prima che la compilazione fallisca e mette in evidenza solo la linea in seguito.
Ho reimplementato questo scenario completamente in C# e non ho incontrato lo stesso problema.
Qualcuno ha qualche idea di cosa sta succedendo qui?
Hai confrontato l'IL emesso in entrambe le lingue? – Oded
Cosa succede se nel codice C# viene trasmesso alla classe base prima di chiamare il metodo? – Brian
@Brian: Funziona. – Daniel