如何使用公共字段声明不可变结构?

Asi*_*sik 8 f#

我想在F#中写出这个C#的等价物:

struct Vector2 {
    public readonly int X;
    public readonly int Y;
    public Vector2(int x, int y) {
        X = x;
        Y = y;
    }
}
Run Code Online (Sandbox Code Playgroud)

这会强制用户提供参数来创建实例[编辑:这对于值类型是错误的 - 所有值类型都有默认构造函数].默认的Vector2也可以提供静态只读字段,即Vector2.Zero.

看起来获取公共字段的唯一方法是通过"val"关键字,但似乎不允许我使用默认构造函数初始化它们,我不希望有两个构造函数:

  [<Struct>]
  type MyInt(value) =
        val public Value : int = value;;

          val public Value : int = value;;
  -------------------------------^

stdin(7,32): error FS0010: Unexpected symbol '=' in member definition
Run Code Online (Sandbox Code Playgroud)

我知道这可以通过成员绑定来完成,但如果我理解的话,这会创建属性,而不是字段.

V.B*_*.B. 6

根据这个http://msdn.microsoft.com/en-us/library/vstudio/dd233233(v=vs.120).aspx,可以这样做

type Vector2 =
   struct 
      val public X: int
      val public Y: int
      new(x: int, y: int) = { X = x; Y = y }
   end
Run Code Online (Sandbox Code Playgroud)

  • @Asik:您的C#代码也是如此 - 这是CLR限制,而不是F#限制. (5认同)