无法在HttpMethod上进行模式匹配

jbe*_*eko 2 f#

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

match System.Net.Http.HttpMethod.Post with
| System.Net.Http.HttpMethod.Post -> "post"
| _ -> "other"
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

rmu*_*unn 8

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

这就是为什么您不能与模式匹配System.Net.HttpMethod.Post:为什么它不是编译时常量。相反,您必须执行以下操作:

match System.Net.Http.HttpMethod.Post with
| method when method = System.Net.Http.HttpMethod.Post -> "post"
| _ -> "other"
Run Code Online (Sandbox Code Playgroud)

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