다음 F # 코드는 기본 클래스와 하위 클래스를 선언합니다. 기본 클래스는 가상 메소드 'Test'를 기본 구현으로 사용합니다. 하위 클래스는 기본 클래스 메서드를 재정의하고 새 오버로드 된 'Test'메서드를 추가합니다. 이 코드는 잘 컴파일되고 하위 'Test'메소드 중 하나에 액세스 할 때 아무런 문제가 없습니다.C#에서 재정의되고 오버로드 된 F # 메서드를 확인할 수 없습니다.
F # 코드 :
var result = td.Test(3); <- No overload for method 'Test' takes 1 arguments
전체 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();
}
}
}
컴파일 오류에 C#을 결과에서 '테스트'의 자손의 재정의를 호출하려고 시도하지만
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
,
이상한 점은 VisualStudio의 Intellisense는 두 가지 오버로드 된 함수를보고, 둘 다 올바른 서명. 빌드가 실패하기 전에 경고 또는 오류를 표시하지 않으며 이후에만 해당 행을 강조 표시합니다.
이 시나리오를 C#에서 완전히 다시 구현했지만 동일한 문제가 발생하지 않았습니다.
누구에게 무슨 일이 일어나고 있는지 아이디어가 있습니까? 또는 단순히 Test2(x,y)
이름을 변경 - -
방출 된 IL을 두 언어로 비교 했습니까? – Oded
C# 코드에서 메서드를 호출하기 전에 기본 클래스로 업 캐스트하면 어떻게됩니까? – Brian
@ 브라이언 : 그건 작동합니다. – Daniel