Не удается сопоставить шаблон с HttpMethod - PullRequest
2 голосов
/ 18 марта 2019

Это не компилируется.Зачем?Сообщение об ошибке сбивает с толку, почему свойство не существует в шаблоне?

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

enter image description here

1 Ответ

8 голосов
/ 18 марта 2019

Если вы посмотрите справочную документацию 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...