F# 使用构造函数初始化结构内部的对象

F# initialize objects inside struct with constructor

我在 F# 中有以下结构:

type public Data = 
    struct
        val class1: Class1
        new() {
            class1 = new Class1()
        }
    end

但是我收到一条错误消息,指出结构不能有空的构造函数。 Class1 是一个 class 具有有效的默认构造函数,需要在使用前进行初始化。因此,我希望 class1 在创建 Data 结构时调用其构造函数。我该怎么做,或者我根本不应该这样做?

正如 Peter 在评论中提到的,结构不能有不带参数的构造函数。事实上,如果您修改语法(添加 = 符号),F# 编译器会准确地告诉您:

type public Data = 
  struct
    val class1: Class1
    new() = { class1 = new Class1() }
  end

error FS0870: Structs cannot have an object constructor with no arguments. This is a restriction imposed on all CLI languages as structs automatically support a default constructor.

你最好的机会可能是创建一个结构(可能是私有的)构造函数采用 Class1 值,并添加一个静态方法,让你使用 Data.Create() 创建默认实例:

[<Struct>]
type Data private(class1:Class1) =
  static member Create() = Data(new Class1())

您也可以使用 struct .. end 编写此代码,但我个人更喜欢使用更简单的对象表示法,只需添加 Struct 属性即可。