【发布时间】:2018-01-03 22:01:31
【问题描述】:
可以在与现有实例和静态方法具有相同名称和类型签名的类型上定义 F# 扩展方法,以有效地覆盖这些方法的默认实现,但是我无法让它在静态属性上工作。
特别是,我正在尝试为DateTime 创建一个扩展方法,该方法返回更精确的时间,如下所示:
#nowarn "51"
open System
module DateTimeExtensions =
open System.Runtime.InteropServices
[<DllImport("Kernel32.dll", CallingConvention = CallingConvention.Winapi)>]
extern void private GetSystemTimePreciseAsFileTime(int64*)
type System.DateTime with
// example showing that static methods can be overridden
static member IsLeapYear(_: DateTime) =
printfn "Using overridden IsLeapYear!"
true
// more accurate UtcNow method (note: not supported by older OS versions)
static member UtcNow =
printfn "Using overridden UtcNow!"
let mutable fileTime = 0L
GetSystemTimePreciseAsFileTime(&&fileTime)
DateTime.FromFileTimeUtc(fileTime)
但是执行时的输出
open DateTimeExtensions
let _ = DateTime.IsLeapYear(DateTime.UtcNow)
只是
Using overridden IsLeapYear!
这表明静态方法“覆盖”正在工作,但不是静态属性。
(注意:我使用的是 F# 4.0)
【问题讨论】:
-
你有什么理由想让它工作吗?由于这仅适用于导入您的模块的代码,因此您最好使用一个不同命名的函数。
标签: f#