对象初始化器+属性初始化器(从C#到F#)

Joh*_*Doe 3 oop f# class

我有一个Person,我希望使用属性初始值设定项初始化Name,使用构造函数初始化Age.

C#版本

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

    public Person(int age)
    {
        Age = age
    }
}

var person = new Person(20) { Name = "Alex" };
Run Code Online (Sandbox Code Playgroud)

我试过F#:

尝试1:语法无效

type Person = {
    Name: string
    Age: int
} with 
    static member create (age: int): Person =
        { this with Age = age }: Person
Run Code Online (Sandbox Code Playgroud)

尝试2:语法无效

type Person =
    member val Name: string
    member val Age: int

    new(age: int)
        this.Age = 13
Run Code Online (Sandbox Code Playgroud)

kvb*_*kvb 6

应该如此简单

type Person(age:int) =
    member val Name = "" with get, set
    member val Age = age with get, set

let person = Person(20, Name = "Alex")
Run Code Online (Sandbox Code Playgroud)

  • @JohnDoe C#隐式提供了`null`和`0`的默认值.F#避免了隐式默认值,因为它们更容易出错.因此,您可以提供与C#相同的默认值,也可以选择更好的默认值.这就是为什么你要做的是F#中的高摩擦力的原因之一.你应该放弃这整个方法,除非你有充分的理由. (3认同)