gpt4 book ai didi

带有对象表达式的 F# 多接口(interface)实现

转载 作者:行者123 更新时间:2023-12-04 04:29:43 28 4
gpt4 key购买 nike

根据文档,您可以使用对象表达式实现多个接口(interface)。但是如果你看到下面的代码:


// Define two interfaces
type IFirst =
abstract F : unit -> unit
abstract G : unit -> unit

type ISecond =
abstract H : unit -> unit
abstract J : unit -> unit

// This object expression implements both interfaces.
let implementer : IFirst =
{ new ISecond with
member this.H() = ()
member this.J() = ()
interface IFirst with
member this.F() = ()
member this.G() = () }

所以转换到 IFirst导致编译器错误。为什么呢?

最佳答案

F# 不执行隐式转换。

let 中键入注释时绑定(bind),类型必须严格匹配表达式。
例如,

let value : obj = new System.Collections.Generic.List<int>()

将无法编译,即使 List很明显是一个对象。

当你写:
let implementer : IFirst = expr 
expr的类型绝对必须是 IFirst .没有像 C# 中那样的隐式转换。

对象表达式将其类型作为实现的抽象类型,因此:
{ new ISecond with ... }

将被推断为具有 ISecond 的类型.将它与无隐式转换规则结合起来,就会出现编译错误。

因为 IFirstISecond不相关,您可以(运行时)向下转换为 IFirst :
let firstImplementer = implementer :?> IFirst

另一种选择是制作一个组合界面:
type IBoth = inherit IFirst inherit ISecond

并做:
let implementer =
{
new IBoth with ...

这样你就可以自由(静态)向上转换到 IFirstISecond .
let firstImplementer = implementer :> IFirst
let secndImplementer = implementer :> ISecond

关于带有对象表达式的 F# 多接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60947147/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com