Mã F # sau đây khai báo lớp cơ sở và hậu duệ. Lớp cơ sở có một phương thức ảo 'Test' với một cài đặt mặc định. Lớp con cháu ghi đè lên phương thức lớp cơ sở và cũng thêm một phương thức 'Thử nghiệm' đã được tải quá tải mới. Mã này biên dịch tốt và không có vấn đề gì khi truy cập một trong hai phương thức 'Thử nghiệm' con cháu.Không thể giải quyết phương thức F # đã bị ghi đè và quá tải từ C#
F # Code:
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
Tuy nhiên, cố gắng gọi override của hậu duệ của 'Test' từ C# kết quả trong một lỗi biên dịch:
var result = td.Test(3); <- No overload for method 'Test' takes 1 arguments
Các đầy đủ C# Code:
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();
}
}
}
Điều kỳ lạ là IntelliSense của VisualStudio thấy hai hàm bị quá tải và cung cấp s chữ ký chính xác cho cả hai. Nó không đưa ra cảnh báo hoặc lỗi trước khi xây dựng không thành công, và chỉ làm nổi bật dòng sau đó.
Tôi đã triển khai lại hoàn cảnh này hoàn toàn bằng C# và không gặp phải vấn đề tương tự.
Bất kỳ ai có ý tưởng gì đang diễn ra ở đây?
Bạn đã so sánh IL đã phát ra ở cả hai ngôn ngữ chưa? – Oded
Điều gì sẽ xảy ra nếu trong mã C# bạn upcast đến lớp cơ sở trước khi gọi phương thức? – Brian
@Brian: Điều đó hoạt động. – Daniel