Następujący kod F # deklaruje klasy podstawowe i potomne. Klasa podstawowa ma wirtualną metodę "Test" z domyślną implementacją. Klasa potomna przesłania metodę klasy bazowej, a także dodaje nową przeładowaną metodę "Test". Ten kod kompiluje dobrze i nie przedstawia żadnych problemów podczas uzyskiwania dostępu do jednej z metod potomnych "Test".Nie można rozwiązać metody F #, która została zarówno nadpisana, jak i przeciążona z C#
F # Kod:
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
Jednak próby wywołania przesłonić potomek dotyczącą 'test' z C# powoduje błąd kompilacji:
var result = td.Test(3); <- No overload for method 'Test' takes 1 arguments
Pełne C# Kod:
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();
}
}
}
Dziwne jest to, że intellisense VisualStudio widzi dwie przeciążone funkcje i zapewnia s poprawne podpisy dla obu. Nie daje ostrzeżeń ani błędów, zanim kompilacja się nie powiedzie, a następnie podświetla tylko linię.
Ponownie wdrożyłem ten scenariusz w pełni w języku C# i nie napotkano tego samego problemu.
Ktoś ma jakieś pomysły, co tu się dzieje?
Czy porównałeś emisję IL w obu językach? – Oded
Co się stanie, jeśli kod C# zostanie uaktualniony do klasy bazowej przed wywołaniem metody? – Brian
@Brian: To działa. – Daniel