如何在F#中扩展System.DateTime?

如何在F#中扩展System.DateTime?,f#,extension-methods,F#,Extension Methods,我想以以下方式延长DateTime: [<AutoOpen>] type System.DateTime with member this.floor (interval: TimeSpan) = this.AddTicks(-(this.Ticks % interval.Ticks)) member this.ceiling (interval: TimeSpan) = let overflow = this.Ticks % interval.Ticks

我想以以下方式延长DateTime:

[<AutoOpen>]
type System.DateTime with
  member this.floor (interval: TimeSpan) =
    this.AddTicks(-(this.Ticks % interval.Ticks))

  member this.ceiling (interval: TimeSpan) =
    let overflow = this.Ticks % interval.Ticks
    if overflow = 0 then this else this.AddTicks(interval.Ticks - overflow)

  member this.round (interval: TimeSpan) =
    let halfIntervalTicks = (interval.Ticks + 1) >>> 1
    this.AddTicks(halfIntervalTicks - ((this.Ticks + halfIntervalTicks) % interval.Ticks))
[

但是这不起作用;显然我应该使用一个模块,但是如何获得“this”部分?正确的语法是什么

我得到这个错误:

[FS0644]命名空间不能包含扩展成员,但在 定义类型的同一文件和命名空间声明组。 考虑使用一个模块来保存扩展成员的声明。< /P>
根据错误消息判断,我假设您在名称空间中有该声明,如下所示:

namespace N

type System.DateTime with
    ...
如果是这样,那么我的第一个问题是:为什么首先需要一个名称空间?请使用模块!模块在F#中更为惯用,可以让您做更多的事情:

module N

type System.DateTime with
    ...

但是,如果出于某种原因您必须有一个名称空间,您仍然可以通过使用错误消息本身中给您的建议来实现这一点:将扩展放在模块中

namespace N

module M =    
    type System.DateTime with
        ...
当然,现在您还必须
在使用站点打开该模块:

open N
open M  // <-- extra open

... DateTime.Now.floor ...


另外,请注意,类型扩展上的
[]
是非感官的。类型扩展总是打开的,这就是它们的要点,您不需要显式打开它们,也不需要使用
自动打开属性。

当您说“这不起作用”时,这到底是什么意思?@FyodorSoikin,对不起,我应该澄清一下;我得到了以下消息:[fs044]命名空间不能包含扩展成员,除非在定义了类型的同一文件和命名空间声明组中。请考虑使用一个模块来保存扩展成员的声明。
namespace N

[<AutoOpen>]
module M =    
    type System.DateTime with
        ...
open N

... DateTime.Now.floor ...