F#擴展方法可以在與現有實例和靜態方法具有相同名稱和類型簽名的類型上定義,以便有效地覆蓋這些方法的默認實現,但是我無法獲得此內容在靜態屬性上工作。執行使用擴展方法覆蓋F#中的靜態屬性
open DateTimeExtensions
let _ = DateTime.IsLeapYear(DateTime.UtcNow)
當
#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)
然而,輸出只是
:特別是,我試圖爲DateTime
返回一個更精確的時間創建的擴展方法如下
Using overridden IsLeapYear!
它表明靜態方法'覆蓋'正在工作,bu不是靜態屬性。
(注:我使用F#4.0)
是否有任何理由希望這項工作?由於這隻能在導入你的模塊的代碼中工作,所以你可能只需要命名不同的函數。 –