F#拡張メソッドは、既存のインスタンスと同じ名前と型シグネチャを持つ型と、これらのメソッドのデフォルトの実装を効果的にオーバーライドする静的メソッドで定義できますが、静的なプロパティで作業します。特に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!
これは、静的メソッド 'override'が動作していることを示しています。bu静的なプロパティではありません。
(注:私は、F#4.0を使用しています)
これを機能させる理由はありますか?これはモジュールをインポートするコードでのみ機能するので、別の名前の関数を持つこともできます。 –