You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

F#实现抽象类属性时出现FS0556、FS0554错误的原因咨询

问题分析与修复

你的代码报错主要有几个问题,逐个解决:

  1. 重写抽象成员要用override而非member
    你继承了抽象类V<'D>,要实现它的抽象属性Preds,必须用override关键字,而不是普通的member。

  2. 属性多写了冗余的泛型参数
    PV<'D>已经声明了泛型参数'D,所以属性Preds后面的<''D>完全多余,直接写Preds就行。

  3. 属性类型笔误
    抽象类里的属性类型是V<'V> list,你写的Vertex<'D> list应该是笔误,改成V<'D> list。

  4. 类型注解位置不符合语法要求
    按照错误提示,属性getter/setter的类型注解要紧跟在get()/set(_)后面,不过这里因为返回类型能通过Utils.impossible推断,甚至可以省略类型注解,要写的话得放在正确位置。

修复后的代码:

module Test =

    type VD(id : int) =
        member this.id = id

    [<AbstractClass>]
    type V<'V when 'V :> VD>(v : 'V option) =
        abstract member Preds : V<'V> list with get

    type PV<'D when 'D :> VD>(v : 'D option) =
        inherit V<'D>(v)
        override _.Preds : V<'D> list
            with get() = Utils.impossible<V<'D> list>()
            // 抽象类里只定义了getter,不需要setter可以删掉该行,否则要先在抽象类声明set
            and set(_) = Utils.impossible<unit>()

额外提醒:原抽象类V<'V>只声明了Preds的getter,如果你在子类里加setter,需要先在抽象类里把Preds声明为with get, set,否则子类不能额外添加setter,会触发新错误。不需要setter的话,直接删掉and set(_)...那一行即可。

内容的提问来源于stack exchange,提问作者Jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 23:42:55