以下F#代碼聲明瞭基類和子類。基類有一個默認實現的虛擬方法'測試'。後代類重寫基類方法,並添加一個新的重載「測試」方法。這段代碼編譯得很好,並且在訪問任何後代'Test'方法時不會出現問題。無法解析已被C#覆蓋並重載的F#方法。
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
然而,試圖從C#的結果調用 '測試' 的後裔的覆蓋編譯錯誤:
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();
}
}
}
奇怪的是,VisualStudio的intellisense看到了兩個重載函數,並提供兩者的正確簽名。它在構建失敗之前不會給出任何警告或錯誤,只會在之後突出顯示該行。
我已經在C#中完全重新實現了這個場景,並沒有遇到同樣的問題。
任何人有任何想法這裏發生了什麼?
您是否比較了兩種語言中發射的IL? – Oded
如果在調用方法之前將C#代碼上傳到基類會發生什麼? – Brian
@Brian:這很有效。 – Daniel