【发布时间】:2018-06-29 15:32:55
【问题描述】:
我有这个 F# 类
module File1
open System
open System.Collections.Generic
type TimeRangeList<'e>(getter: DateTime * DateTime -> List<'e>, ?maybe_tFrom: DateTime, ?maybe_tTo: DateTime) as this =
inherit List<'e>()
//inherit List<'e>(getter(defaultArg maybe_tTo DateTime.Now, defaultArg maybe_tFrom ((defaultArg maybe_tTo DateTime.Now).AddDays(-1.0))))
let tTo = defaultArg maybe_tTo DateTime.Now
let tFrom = defaultArg maybe_tFrom (tTo.AddDays(-1.0))
do this.AddRange(getter(tFrom, tTo))
现在我想添加构造函数并使用here中的语法
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
这段代码给出了两个错误:
- 在 'tFrom=...' 中显示 'tTo not defined' 而 tTo 显然在 范围;作为一种解决方法,我可以重复 defaultArg 调用,如图所示 以下(注释)行。有没有更好的方法?
- 在调用“AddRange”的最后一行,它抱怨说do 调用只能在主构造函数中执行,这是公平的。但是,如何调用必要的 AddRange 来初始化列表?我尝试了不同的选择,但找不到方法。在注释的继承行中显示了一种解决方法,但最后我重复且冗余地调用 defaultArg;一定有更清晰更优雅的方式
【问题讨论】:
-
实际上,您的代码示例中最大的问题是您的类型定义不是类定义,因为您省略了括号。你应该写
type TimeRangeList<'e>() =。这不会修复您的代码,但您会遇到更有意义的错误。 -
@ThomasCorbière 我知道这一点,但这是官方文档对多个构造函数所做的(按照两个代码摘录之间的链接“这里”)。使用通常的默认构造函数语法会强制所有其他构造函数调用主构造函数,而主构造函数又调用一个特定的基本构造函数。如果我们想要不同的派生构造函数调用不同的基构造函数,则使用的语法是没有主构造函数的语法。
-
哦,对不起,我错过了!我找到了第一个问题的解决方案,请参阅下面的答案。
-
"...您的类型定义不是类定义,因为您省略了括号。"那是不对的。静态类没有构造函数/括号。
标签: inheritance constructor f#