Если вы посмотрите справочную документацию 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"
Это допустимый синтаксис F #, который будет компилироваться. Немного неловко, да, но это результат пересечения правил компилятора F # и того, как была разработана библиотека .Net.