F # не не выполняет неявные преобразования.
При аннотировании типа в привязке let
тип должен строго соответствовать выражению. Например,
let value : obj = new System.Collections.Generic.List<int>()
не удастся скомпилировать, даже если List
очень очевидно является объектом.
Когда вы пишете:
let implementer : IFirst = expr
Тип из expr
должно быть абсолютно IFirst
. Не существует неявного приведения типа C#.
. Выражение объекта будет иметь свой тип в качестве реализованного абстрактного типа, поэтому:
{ new ISecond with ... }
будет выведено, чтобы иметь тип ISecond
. Объедините его с правилом неявного приведения, и у вас будет ошибка компиляции.
Поскольку IFirst
и ISecond
не связаны, вы можете (во время выполнения) понизить до IFirst
:
let firstImplementer = implementer :?> IFirst
Другим вариантом является создание комбинированного интерфейса:
type IBoth = inherit IFirst inherit ISecond
и выполнение:
let implementer =
{
new IBoth with ...
Таким образом, вы можете свободно (stati c) обновляться до IFirst
или ISecond
.
let firstImplementer = implementer :> IFirst
let secndImplementer = implementer :> ISecond