我有一个类和一个记录的定义如下:
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
这个无法编译,报错信息如下:
成员或对象构造函数 'op_Addition' 不是公共的。私有成员只能从声明类型内部访问。受保护成员只能从扩展类型访问,不能从内部 lambda 表达式访问。
两种类型都是内部的。如果我明确将 +
运算符设置为 public,这也没有帮助:
static member public (+) (left : MyRecord, right : MyRecord) : MyRecord
有效的方法是放弃使用运算符并使用静态方法:
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
当在这种情况下使用运算符时,为什么F#编译器会遇到麻烦,而使用命名成员却可以正常工作?
将两种类型都从internal更改为public也可以解决编译错误。
我正在使用Visual Studio 2012和F# 3.0,目标是.NET Framework 3.5。
microsoft.com
上的fsbugs
,以便F#团队可以研究它。 - Jack P.op_Addition
的约束时,该约束为AccessibleFromEverywhere
而不是AccessibleFromSomewhere
。实际修复似乎相当复杂,可能会影响编译器的其余部分。 - vcsjones