Краткое резюме таково, что в рекурсивной группе (например, члены одного типа или члены рекурсивных типов, как у нас здесь) F # читает объявления слева направо сверху вниз порядок, за которым следуют определения в порядке слева направо сверху вниз. Таким образом, в этом случае, когда он достигает определения A.Call
, он еще не прочитал определение из B.GetInstance
и поэтому (пока!) Не знает, что тип возвращаемого значения GetInstance
будет B
.
Ответ Кейта подходит для этой ситуации, вы можете предоставить аннотацию типа, чтобы указать тип возврата GetInstance
в его объявлении.
См
Принудительный вывод типа F # для обобщенных элементов и интерфейсов, чтобы они оставались свободными
для глубокого обсуждения того, что здесь происходит.
Также обратите внимание, что в исходной попытке вам не нужно «приводить» (потенциально динамическая операция, используя :>
), вместо этого вы можете просто «аннотировать» (статически объявить тип, используя :
) чтобы получить его для компиляции. Но имеет смысл поместить аннотацию типа в объявление метода для GetInstance
(обычно предпочтительнее добавлять аннотации к сигнатурам метода, а не к произвольным местам внутри тел).