Я не знаю достаточно о проверке типов, чтобы объяснить поведение (и я не думаю, что спецификация F # объясняет это, потому что она только кратко упоминает "рекурсивные типы" на стр. 120).
В любом случае, в спецификации сказано, что компилятор проверяет определения рекурсивного типа как одну группу, и поэтому использование метода, подобного Wait
, используется для (частично) вывода его типа.Когда вы указываете тип явно, тогда явное определение переопределяет выведенное.
В вашем примере проблема появляется только тогда, когда Ref<'T>
является универсальным типом.Когда вы вызываете Wait
, компилятор, вероятно, правильно делает вывод, что тип метода unit -> unit
, но я думаю, что есть некоторая гибкость в параметре this
метода (для некоторых 'T
это Ref<'T>
).
Исходя из исходного кода компилятора , ошибка сообщается только в случае сбоя добавления какого-либо ограничения, связанного с переменной this
(строка 8914), при обработке определения метода Wait
,Итак, я предполагаю, что некоторое ограничение, связанное со значением ref
внутри Load
, позже конфликтует с некоторым ограничением, сгенерированным из Wait
(когда компилятор проверяет метод и не имеет полных аннотаций, чтобы знать тип дляуверен).