Inheritance 具有多个构造函数语法的F#继承

Inheritance 具有多个构造函数语法的F#继承,inheritance,constructor,f#,Inheritance,Constructor,F#,我有这个F级 模块文件1 开放系统 open System.Collections.Generic 键入TimeRangeList,?可能是从:DateTime,?可能是到:DateTime),如下所示: 继承列表(getter(defaultArg可能\u tTo DateTime.Now,defaultArg可能\u tFrom((defaultArg可能\u tTo DateTime.Now).AddDays(-1.0))) 让tTo=defaultArg也许\u tTo DateTime

我有这个F级

模块文件1
开放系统
open System.Collections.Generic
键入TimeRangeList,?可能是从:DateTime,?可能是到:DateTime),如下所示:
继承列表(getter(defaultArg可能\u tTo DateTime.Now,defaultArg可能\u tFrom((defaultArg可能\u tTo DateTime.Now).AddDays(-1.0)))
让tTo=defaultArg也许\u tTo DateTime.现在
设tFrom=defaultArg可能来自(tTo.AddDays(-1.0))
执行此操作。AddRange(getter(tFrom,tTo))
现在我想添加构造函数并使用中的语法

键入时间范围列表
val-tFrom:DateTime
日期时间
新建(getter:DateTime*DateTime->List()

//继承列表要解决第一个问题,您应该为当前对象指定一个名称:
new(…)as this=
,然后使用它访问变量
this.tTo.AddDays(-1.0)


我还没有第二个问题的解决方案。

这是您正在寻找的语法:

module File1

open System
open System.Collections.Generic

type TimeRangeList<'e> = 
    inherit List<'e>
    val tFrom: DateTime
    val tTo: DateTime
    new (getter: DateTime * DateTime -> List<'e>, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) as this =
        let to_ = defaultArg maybe_tTo DateTime.Now
        let from_ = defaultArg maybe_tFrom (to_.AddDays(-1.0))
        {
            inherit List<'e>()

            tTo = to_
            tFrom = from_
        }
        then
            this.AddRange(getter(this.tFrom, this.tTo))

实际上,代码示例中最大的问题是类型定义不是类定义,因为省略了括号TimeRangeList@ThomasCorbi我知道这一点,但这是官方文档对多个构造函数所做的(请按照两段代码摘录之间的“此处”链接进行操作)。使用通常的默认构造函数语法会强制所有其他构造函数调用主构造函数,而主构造函数又会调用一个特定的基构造函数。如果我们希望不同的派生构造函数调用不同的基构造函数,则使用没有主构造函数的语法。哦,抱歉,我错过了!我找到了解决方案对于第一个问题,请参见下面我的答案。“…您的类型定义不是类定义,因为您遗漏了括号。”这是不对的。静态类没有构造函数/括号。感谢您提供的宝贵信息。不过,官方文档中的更多细节不会有什么坏处,imho@FrancoTiveron-同意,文档可能会更好。但是,如果您向下滚动到文档底部,您可以通过Github提交PR以改进是的,微软的文档已经开源了!所以现在,当你发现一些文档记录不好的东西时,你至少有能力做点什么。你可能没有时间(我现在没有),但我很高兴改进文档的选项实际上是可用的。
type TimeRangeList<'e> = 
    inherit List<'e>
    val tFrom: DateTime
    val tTo: DateTime
    new (getter: DateTime * DateTime -> List<'e>, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) = {
            inherit List<'e>()
            //inherit List<'e>(defaultArg maybe_tFrom ((defaultArg maybe_tTo DateTime.Now).AddDays(-1.0)), getter(defaultArg maybe_tTo DateTime.Now))

            tTo = defaultArg maybe_tTo DateTime.Now
            tFrom = defaultArg maybe_tFrom (tTo.AddDays(-1.0)) //tTo undefined
            //tFrom = defaultArg maybe_tFrom ((defaultArg maybe_tTo DateTime.Now).AddDays(-1.0))
        }
    do this.AddRange(getter(tFrom, tTo)) //primary constructor required
module File1

open System
open System.Collections.Generic

type TimeRangeList<'e> = 
    inherit List<'e>
    val tFrom: DateTime
    val tTo: DateTime
    new (getter: DateTime * DateTime -> List<'e>, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) as this =
        let to_ = defaultArg maybe_tTo DateTime.Now
        let from_ = defaultArg maybe_tFrom (to_.AddDays(-1.0))
        {
            inherit List<'e>()

            tTo = to_
            tFrom = from_
        }
        then
            this.AddRange(getter(this.tFrom, this.tTo))
new () =
    let result = expensiveCalculationIWantToDoOnlyOnce()
    { field1 = result; field2 = result + 1; field3 = result + 2 }