Inheritance F#与继承相关的编译错误

Inheritance F#与继承相关的编译错误,inheritance,compilation,f#,Inheritance,Compilation,F#,我在C#组件中定义了2个接口,其中1个接口继承自另一个通用接口 public interface IRepository<T> { void Add(T obj); void Update(T obj); void Delete(T obj); } public interface IDataModelRepository : IRepository<DataModel> { } 公共接口IRepository { 无效添加(T obj); 无效更新(T obj

我在C#组件中定义了2个接口,其中1个接口继承自另一个通用接口

public interface IRepository<T>
{
void Add(T obj);
void Update(T obj);
void Delete(T obj);
}
public interface IDataModelRepository :
    IRepository<DataModel>
{
}
公共接口IRepository
{
无效添加(T obj);
无效更新(T obj);
无效删除(T obj);
}
公共接口IDataModelRepository:
间接的
{
}
我有一个F#组件,在其中我定义了一个泛型类型,并使用泛型接口的构造函数参数:

type Domain<T> ( getRepository:System.Func<IRepository<T>>) = ...
类型域(getRepository:System.Func)=。。。
然后,我使用派生接口定义一个派生类型:

type DataModelDomain ( getRepository:System.Func<IDataModelRepository>) =
inherit Domain<DataModel> (getRepository)
type DataModelDomain(getRepository:System.Func)=
继承域(getRepository)
如果给出DataModelDomain类型的错误消息,则不会编译:

类型“IRepository”与类型“IDataModelRepository”不匹配


但是,如果我以类似的方式在C#组件的类中定义这些“域”类型,它就会编译。是否有一种方法可以定义从泛型域类型派生的DataModelDomain类型,并使用派生接口IDataModelRepository

我想我在编译F#代码时设法重现了这个问题。然后通过创建一个新函数,调用其中的另一个函数,并安全地向上转换结果来修复它:
(fun()->getRepository.Invoke():>IRepository)

事情是这样的:

type DataModel = DataModel

type IRepository<'T> =
    abstract member Add: 'T -> unit
    abstract member Update : 'T -> unit
    abstract member Delete : 'T -> unit

type IDataModelRepository =
    inherit IRepository<DataModel>

type Domain<'T> ( getRepository:System.Func<IRepository<'T>>) =
    do ()

type DataModelDomain ( getRepository:System.Func<IDataModelRepository>) =
    inherit Domain<DataModel> (fun () -> getRepository.Invoke() :> IRepository<DataModel>)
    do ()
type DataModel=DataModel
I型存储单元
抽象成员更新:'T->unit
抽象成员删除:'T->unit
IDataModelRepository型=
继承假定
键入域>)=
do()
类型DataModelDomain(getRepository:System.Func)=
继承域(fun()->getRepository.Invoke():>IRepository)
do()

您是否尝试过:
继承域(getRepository:>IRepository)
?是的,我尝试过。它显示另一条错误消息:“System.Func”类型没有任何子类型,不需要用作静态协作的目标。为什么要使用
System.Func
而不是简单的
(getRepository:IRepository)
?该应用程序是一个桌面应用程序。域实例是单实例,在启动时创建。该应用现在的架构是这样的:从UI到域的每次调用都会创建一个存储库的新实例。是的,谢谢!我已经朝这个方向看了,但是我缺少了“Invoke()”部分。我不知道这到底是为什么,不仅仅是“getRepository()”,但这是我对F的有限了解。如果这都是F代码,你就不会使用
Func
,而是使用F函数:
unit->IRESPository是的,你是对的。在我的例子中,“存储库层”是一个C#组件。原因是我在迁移中使用了EFCore。据我所知,F#不支持迁移。