次の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のインテリセンスが2つのオーバーロードされた関数を見て、両方の正しい署名。ビルドに失敗する前に警告やエラーを表示せず、後でその行だけをハイライト表示します。
私はこのシナリオをC#で完全に再実装しており、同じ問題にぶつからなかった。
誰もがここで何が起こっているか考えていますか?
放出されたILを両方の言語で比較しましたか? – Oded
C#コードでメソッドを呼び出す前にベースクラスにアップキャストした場合はどうなりますか? – Brian
@ブライアン:それは動作します。 – Daniel