我想定义一个包含一些成员方法的结构。我想使用[<ReflectedDefinition>]
来标记该struct member方法。但编译器告诉我这是错误的。
首先,看看这段代码:
type Int4 =
val mutable x : int
val mutable y : int
val mutable z : int
val mutable w : int
[<ReflectedDefinition>]
new (x, y, z, w) = { x = x; y = y; z = z; w = w }
[<ReflectedDefinition>]
member this.Add(a:int) =
this.x <- this.x + a
this.y <- this.y + a
this.z <- this.z + a
this.w <- this.w + a
override this.ToString() = sprintf "(%d,%d,%d,%d)" this.x this.y this.z this.w
它编译。但如果我将类型设为结构,则无法编译:
[<Struct>]
type Int4 =
val mutable x : int
val mutable y : int
val mutable z : int
val mutable w : int
[<ReflectedDefinition>]
new (x, y, z, w) = { x = x; y = y; z = z; w = w }
[<ReflectedDefinition>]
member this.Add(a:int) = // <----------- here the 'this' report compile error
this.x <- this.x + a
this.y <- this.y + a
this.z <- this.z + a
this.w <- this.w + a
override this.ToString() = sprintf "(%d,%d,%d,%d)" this.x this.y this.z this.w
我收到以下错误:
error FS0462: Quotations cannot contain this kind of type
在此代码中指向this
。
任何人都知道为什么我不能在结构成员函数上创建引用?我想这可能是因为该结构是值类型,所以这个指针应该是byref。
答案 0 :(得分:3)
事实上,F#3.0中观察到的编译器错误读取:
错误FS1220:ReflectedDefinitionAttribute可能未应用于实例 结构类型的成员,因为实例成员采用隐式“this” byref参数
观察到的行为的根本原因是F#引用的限制 - 您不能在引用的代码中使用byref
类型。
然而,此限制的后果仅适用于实例 struct
成员; static
struct
个成员可以使用[<ReflectedDefinition]>
属性进行修饰。