2017-07-28 12 views
2

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を使用しています)

+0

これを機能させる理由はありますか?これはモジュールをインポートするコードでのみ機能するので、別の名前の関数を持つこともできます。 –

答えて

3

このステートメントが正しくないように思わ:

F#の拡張メソッドは、既存のインスタンスと同じ名前と 型シグネチャを持つタイプに定義することができ

これらのメソッドのデフォルトの実装をオーバーライドするには、 を有効にする静的メソッドを使用してください。しかし、私は を静的プロパティで動作させることはできません。

いいえ、オーバーライドしません。

実際にIsLeapYearの署名が間違っているため、整数が必要なので混乱するかもしれません。なぜなら、新しい(拡張)メソッドを追加するだけで、何も上書きしていないということです。

あなたは、元の署名でそれをしようとした場合、あなたはそれはどちらか動作しないことがわかります:

type System.DateTime with 
    // example showing that static methods can NOT be overridden 
    static member IsLeapYear(_: int) = 
     printfn "Using overridden IsLeapYear!" 
     false 

> DateTime.IsLeapYear(2000);; 
val it : bool = true 

静的プロパティー拡張の動作と一致しています。

とにかく、言語を設計するときにそのような決定があった場合、なぜオーバーライドしないことに決めたのか分かりません。興味深い機能だと思うし、少なくともそれを実装しないのが良い理由があるならば、メソッドが既に存在するので決して呼び出されないので警告を出すべきです。

多分私はF#コンパイラの問題や示唆を開くでしょう。

+1

問題を開いたか、少なくともディスカッションを開いた:https://github.com/Microsoft/visualfsharp/pull/3582#issuecomment-333663962 – Abel

関連する問題