Tôi có một lớp và một kỷ lục được xác định như sau:Tại sao trình biên dịch F # thất bại với toán tử infix này?
namespace Foo
type internal MyRecord =
{
aValue1 : int
aValue2 : int
}
static member (+) (left : MyRecord, right : MyRecord) : MyRecord =
{aValue1 = left.aValue1 + right.aValue1; aValue2 = left.aValue2 + right.aValue2;}
type internal Bar() =
member this.Baz() =
let myRecord1 = {aValue1 = 2; aValue2 = 3;}
let myRecord2 = {aValue1 = 7; aValue2 = 5;}
let sum = myRecord1 + myRecord2 //Does not compile
0
này thất bại trong việc biên dịch với:
Các thành viên hoặc 'op_Addition' đối tượng constructor không được công khai. Các thành viên cá nhân chỉ có thể được truy cập từ bên trong loại khai báo. Các thành viên được bảo vệ chỉ có thể được truy cập từ một loại mở rộng và không thể truy cập được từ các biểu thức lambda bên trong.
Cả hai loại đều là nội bộ. Nếu tôi dứt khoát thiết lập các nhà điều hành +
cho công chúng, điều đó không giúp được gì:
static member public (+) (left : MyRecord, right : MyRecord) : MyRecord
gì không công việc chỉ được ít ưu điểm sử dụng của một nhà điều hành và sử dụng một phương pháp tĩnh:
namespace Foo
type internal MyRecord =
{
aValue1 : int
aValue2 : int
}
static member Add (left : MyRecord, right : MyRecord) : MyRecord =
{aValue1 = left.aValue1 + right.aValue1; aValue2 = left.aValue2 + right.aValue2;}
type internal Bar() =
member this.Baz() =
let myRecord1 = {aValue1 = 2; aValue2 = 3;}
let myRecord2 = {aValue1 = 7; aValue2 = 5;}
let sum = MyRecord.Add(myRecord1, myRecord2) //Does compile
0
Tại sao hiện F # trình biên dịch đấu tranh với việc sử dụng một nhà điều hành trong trường hợp này khi sử dụng một thành viên được đặt tên làm việc tốt?
Thay đổi cả hai loại thành công khai thay vì nội bộ cũng giải quyết được lỗi biên dịch.
Tôi đang sử dụng Visual Studio 2012 với nhắm mục tiêu F # 3.0 .NET Framework 3.5.
Đây có thể là lỗi trình biên dịch - trong nháy mắt, mã của bạn có vẻ như nó phải hợp lệ. Bạn nên gửi email này đến 'fsbugs' tại' microsoft.com' để nhóm F # có thể xem xét nó. –
Điều này * trông * giống như một lỗi đối với tôi. Có vẻ như khi giải quyết các ràng buộc cho 'op_Addition', ràng buộc là' AccessibleFromEverywhere' thay vì 'AccessibleFromSomewhere'. Các sửa chữa thực tế xuất hiện khá phức tạp mà không ảnh hưởng đến phần còn lại của trình biên dịch. – vcsjones