我正在编写一个F#服务,使用Quartz.Net来轮询另一个服务(用C#编写):
[<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
Quartz为每个轮询将context
传递给Execute
函数,并包含一个字典。服务首次运行LastPoll
的值将是默认的DateTime
值,即01/01/0001 00:00:00
。然后,下次调度程序运行LastPoll
将包含上次轮询的时间。
我可以使用Nullable<DateTime>
构造创建一个if..then..else
(上图)但是当我尝试使用模式匹配时,我在DateTime.MinValue
下遇到了一个波浪形的编译器错误:
此字段不是文字,不能用于模式
我尝试使用的代码如下:
//this doesn't...
let effectiveFrom =
match storedDate with
| DateTime.MinValue -> System.Nullable()
| _ -> System.Nullable(storedDate)
答案 0 :(得分:3)
您使用的图案匹配略有错误。
以下应该有效:
let effectiveFrom =
match storedDate with
| d when d = DateTime.MinValue -> System.Nullable()
| _ -> System.Nullable(storedDate)
如果要在模式匹配中测试相等性,则需要使用when子句(请参阅此处 - https://fsharpforfunandprofit.com/posts/match-expression/)