为什么F#引用不能包含struct?

时间:2013-04-11 02:37:23

标签: f#

我想定义一个包含一些成员方法的结构。我想使用[<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。

1 个答案:

答案 0 :(得分:3)

事实上,F#3.0中观察到的编译器错误读取:

  

错误FS1220:ReflectedDefinitionAttribute可能未应用于实例   结构类型的成员,因为实例成员采用隐式“this”   byref参数

观察到的行为的根本原因是F#引用的限制 - 您不能在引用的代码中使用byref类型。

然而,此限制的后果仅适用于实例 struct成员; static struct个成员可以使用[<ReflectedDefinition]>属性进行修饰。