这不能编译。为什么?错误消息令人困惑,为什么模式中不存在该属性?
match System.Net.Http.HttpMethod.Post with
| System.Net.Http.HttpMethod.Post -> "post"
| _ -> "other"
答案 0 :(得分:8)
如果您查看F# reference documentation on pattern matching,就会发现可以匹配的第一种模式是常量模式,称为“任何数字,字符或字符串文字,枚举常量,或定义的文字标识符。”这些都是 compile-time 常量,因此编译器可以安全地将其编译为已编译的IL代码中的单个值。但是,System.Net.HttpMethod.Post不是枚举值,它是Namespace
类的静态属性。无法将属性安全地编译为常数,因为访问该属性时,所涉及的类可能会做任何事情(包括副作用)。
这就是为什么您无法与HttpMethod
进行模式匹配的原因:它不是编译时常量。相反,您必须执行以下操作:
System.Net.HttpMethod.Post
这是合法的F#语法,将进行编译。有点尴尬,是的,但这是F#编译器规则与.Net库如何设计之间相交的结果。