如何在F#中扩展System.DateTime?
我想以以下方式延长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
[<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 ...