枚举从.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#代码,可以使用结构区分联合。