2016-11-30 7 views
3

私は(それは、C#で書かれている)別のサービスをポーリングするQuartz.Netを使用してF#のサービスを書いています:DateTime.MinValueとのパターンマッチング?

[<PersistJobDataAfterExecution>] 
[<DisallowConcurrentExecution>] 
type PollingJob() = 
    interface IJob with 
     member x.Execute(context: IJobExecutionContext) = 
      let uri = "http://localhost:8089/" 
      let storedDate = context.JobDetail.JobDataMap.GetDateTime("LastPoll") 
      //this works... 
      let effectiveFrom = (if storedDate = DateTime.MinValue then System.Nullable() else System.Nullable(storedDate)) 

      let result = someFunction uri effectiveFrom 

      context.JobDetail.JobDataMap.Put("LastPoll", DateTime.UtcNow) |> ignore 

contextは、すべての投票のためにクォーツでExecute関数に渡すと辞書が含まれています。サービスが初めて実行されるとき、LastPollの値はデフォルトのDateTimeの値、つまり01/01/0001 00:00:00になります。次に、スケジューラーが次に実行されるときに、LastPollは最後のポーリングの時刻を含みます。

私は(上記)if..then..else構文を使用してNullable<DateTime>を作成することができますが、私は波線DateTime.MinValue下でコンパイルエラーを取得するパターンマッチングを使用しようとすると:

このフィールドはリテラルではないとすることはできませんパターン

で使用される次のように私が使用しようとしていますコードは次のとおりです。

//this doesn't... 
let effectiveFrom = 
    match storedDate with 
    | DateTime.MinValue -> System.Nullable() 
    | _ -> System.Nullable(storedDate) 

答えて

3

パターンマッチングが多少間違って使用されています。

以下に動作するはずです:

let effectiveFrom = 
     match storedDate with 
     | d when d = DateTime.MinValue -> System.Nullable() 
     | _       -> System.Nullable(storedDate) 

を使用すると、パターンマッチの一部として平等をテストしたい場合は、あなたがするとき句を使用する必要があります(ここを参照してください - https://fsharpforfunandprofit.com/posts/match-expression/)を

完璧に動作
+2

、感謝君は。そしてリンクに感謝します。 –

関連する問題