Следующий код F # объявляет базовые и потоковые классы. Базовый класс имеет виртуальный метод "Тест" с реализацией по умолчанию. Класс потомков переопределяет метод базового класса, а также добавляет новый перегруженный метод "Тест" . Этот код отлично компилируется и не представляет проблем при доступе к методу "Test", принадлежащему потомству.
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
Однако попытка вызвать переопределение потомка 'Test' из С# приводит к ошибке компиляции:
var result = td.Test(3); < - Нет перегрузки для метода "Тест" принимает 1 аргумент
Полный код С#:
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();
}
}
}
Странно то, что VisualStudio intellisense видит две перегруженные функции и предоставляет правильные подписи для обоих. Он не дает никаких предупреждений или ошибок, прежде чем сборка завершится неудачей, и только подсветит линию позже.
Я полностью выполнил этот сценарий полностью на С# и не столкнулся с той же проблемой.
У кого-нибудь есть идеи, что здесь происходит?