无法在HttpMethod上进行模式匹配

时间:2019-03-17 21:01:14

标签: f#

这不能编译。为什么?错误消息令人困惑,为什么模式中不存在该属性?

match System.Net.Http.HttpMethod.Post with
| System.Net.Http.HttpMethod.Post -> "post"
| _ -> "other"

enter image description here

1 个答案:

答案 0 :(得分:8)

如果您查看F# reference documentation on pattern matching,就会发现可以匹配的第一种模式是常量模式,称为“任何数字,字符或字符串文字,枚举常量,或定义的文字标识符。”这些都是 compile-time 常量,因此编译器可以安全地将其编译为已编译的IL代码中的单个值。但是,System.Net.HttpMethod.Post不是枚举值,它是Namespace类的静态属性。无法将属性安全地编译为常数,因为访问该属性时,所涉及的类可能会做任何事情(包括副作用)。

这就是为什么您无法与HttpMethod进行模式匹配的原因:它不是编译时常量。相反,您必须执行以下操作:

System.Net.HttpMethod.Post

这是合法的F#语法,将进行编译。有点尴尬,是的,但这是F#编译器规则与.Net库如何设计之间相交的结果。