使用F# Seq.cast时出现意外转换异常,此现象是否符合预期?
问题:Seq.cast无法调用C#定义的隐式转换是否符合预期?
场景复现
有如下C#类库代码,定义了从A到B的隐式转换:
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 // 报错:无法将A转换为B
解答:该现象完全符合预期
原因如下:
Seq.cast<'T>仅支持CLR原生的类型转换逻辑,包括引用类型的上下转型、值类型的装箱拆箱、系统预定义的数值类型转换等,它不会识别或调用自定义的转换运算符。- C#中的隐式转换运算符是语言层面的语法糖,编译后会生成名为
op_Implicit的静态方法,CLR本身并不将其视为原生的类型转换机制。因此在F#中必须像someBs1那样手动调用这个静态方法来完成转换,Seq.cast不会自动触发该方法。
内容的提问来源于stack exchange,提问作者Franco Tiveron
相关产品推荐
相关产品推荐

