在F#中,具有强制构造函数参数的对象初始化程序语法是什么?

时间:2014-07-15 13:21:14

标签: c# f# c#-to-f#

让我们说有一个带有一个公共构造函数的类,它带有一个参数。此外,我还想设置多个公共属性。 F#中的语法是什么?例如在C#

public class SomeClass
{
    public string SomeProperty { get; set; }

    public SomeClass(string s)
    { }
}

//And associated usage.
var sc = new SomeClass("") { SomeProperty = "" };

在F#中,我可以使用构造函数或property setters完成此操作,但不能同时使用C#。例如,以下内容无效

let sc1 = new SomeClass("", SomeProperty = "")
let sc2 = new SomeClass(s = "", SomeProperty = "")
let sc3 = new SomeClass("")(SomeProperty = "")

看起来我错过了什么,但是什么?

<编辑正如 David 指出的那样,在F#中完成所有工作,但出于某种原因,至少对我来说:),当它变得困难时要在F#中使用的类是在C#中定义的。至于这样的一个例子是TopicDescription(为了补充一个例子来构建公开的东西)。例如,可以编写

let t = new TopicDescription("", IsReadOnly = true)

并且相应的编译器错误将是Method 'set_IsReadOnly' is not accessible from this code location

2 个答案:

答案 0 :(得分:6)

我从不用F#编程,但这对我来说似乎很合适:

type SomeClass(s : string) =
    let mutable _someProperty = ""
    let mutable _otherProperty = s
    member this.SomeProperty with get() = _someProperty and set(value) = _someProperty <- value
    member this.OtherProperty with get() = _otherProperty and set(value) = _otherProperty <- value

let s = new SomeClass("asdf", SomeProperty = "test");

printf "%s and %s" s.OtherProperty s.SomeProperty;

输出"asdf and test"


此外,以下代码适用于我:

public class SomeClass
{
    public string SomeProperty { get; set; }
    public string OtherProperty { get; set; }

    public SomeClass(string s)
    {
        this.OtherProperty = s;
    }
}

然后在F#中:

let s = SomeClass("asdf", SomeProperty = "test")

答案 1 :(得分:6)

您遇到的问题是IsReadOnly有内部制定者。

member IsReadOnly : bool with get, internal set

如果您想直接设置它,则需要继承TopicDescription

您正在查看的构造函数语法是完全可以接受的。

let test = new Microsoft.ServiceBus.Messaging.TopicDescription("", EnableBatchedOperations=true)

编译对我很好。