Библиотека C#
public class A
{
public static implicit operator B(A a) => new B();
}
public class B
{
}
Используется в этом коде F#
let someAs = [A(); A(); A()]
let someBs1 = someAs |> Seq.map (fun a -> A.op_Implicit(a)) |> List.ofSeq
let someBs2 = Seq.cast<B> someAs |> List.ofSeq //Unable to cast A to B
Вопреки моим ожиданиям, Seq.cast не использует неявный оператор. Ожидается ли это?





Поддержка неявных операторов ограничена в F#. Короче говоря, F# автоматически вызывает op_Implicit, когда вы вызываете метод с известными типами как для источника, так и для цели, например:
// C#
public class C
{
public static void UseB(B b) { }
}
// F#
C.UseB(A())
Ваш код не пытается передать экземпляр A методу, который ожидает B, поэтому F# не вызывает op_Implicit автоматически.
Я не опытный разработчик F#, но если Seq.cast использует Enumerable.Cast , то да, это ожидаемо, потому что Enumerable.Cast использует
asи «Пользовательские преобразования не учитываются операторами is и as» - MSDN