枚举从.net到F#模式匹配的每周日期

枚举从.net到F#模式匹配的每周日期,.net,f#,pattern-matching,.net,F#,Pattern Matching,我得到一个关于此函数的警告: let dayofW' (d:System.DateTime) = match d.DayOfWeek with | DayOfWeek.Sunday -> 0.0 | DayOfWeek.Monday -> 1.0 | DayOfWeek.Tuesday -> 2.0 | DayOfWeek.Wednesday -> 3.0 | DayOfWeek.Thursday -> 4.0 | Da

我得到一个关于此函数的警告:

let dayofW' (d:System.DateTime) =
  match d.DayOfWeek with
  | DayOfWeek.Sunday    -> 0.0
  | DayOfWeek.Monday    -> 1.0
  | DayOfWeek.Tuesday   -> 2.0
  | DayOfWeek.Wednesday -> 3.0
  | DayOfWeek.Thursday  -> 4.0
  | DayOfWeek.Friday    -> 5.0
  | DayOfWeek.Saturday  -> 6.0
此表达式上的模式匹配不完整。例如 值'enum(7)'可能表示本协议未涵盖的情况 图案

我知道我必须处理Enum(而不是DU),但我找不到方法。我在msdn语言引用中找不到“枚举模式”


如何以最小的过度工作消除警告?

最简单的方法是在末尾添加忽略模式:

let dayofW' (d:System.DateTime) =
  match d.DayOfWeek with
  | DayOfWeek.Sunday    -> 0.0
  | DayOfWeek.Monday    -> 1.0
  | DayOfWeek.Tuesday   -> 2.0
  | DayOfWeek.Wednesday -> 3.0
  | DayOfWeek.Thursday  -> 4.0
  | DayOfWeek.Friday    -> 5.0
  | DayOfWeek.Saturday  -> 6.0
  | _ -> 0.0 //Or throw an error, depends on how you wanna deal with this

发生这种情况的原因是,即使您列出了
DayOfWeek
枚举的所有可能组合,但任何数值都可以强制转换为枚举,因此理论上
d.DayOfWeek
可能有一个未在模式中列出的值。

问题是,.NET枚举不是“强”的。比如说,

(DayOfWeek)42
DayOfWeek
enum的完全有效值

这意味着您还必须处理其他可能的值,而不仅仅是“命名”值。现在,当然,
(DayOfWeek)42
不应该出现在任何地方,因此对这样的值的正确响应可能是异常或某个错误值。但您仍然必须将其添加为另一种模式:

| _ -> WhateverErrorValue

说它完全有效是错误的。它是可存储的,但无效。正如你所说,它不应该出现,它是一个错误。这部分代码不应负责检查此错误。不幸的是,F#并不擅长处理枚举类型。对于不必与其他.Net代码交互的纯F#代码,可以使用结构区分联合。