Ошибка компиляции F #, связанная с наследованием - PullRequest
2 голосов
/ 17 февраля 2020

У меня есть 2 интерфейса, определенных в компоненте C#, где 1 интерфейс наследуется от другого универсального c интерфейса

public interface IRepository<T>
{
void Add(T obj);
void Update(T obj);
void Delete(T obj);
}
public interface IDataModelRepository :
    IRepository<DataModel>
{
}

У меня есть компонент F #, в котором я определяю тип generi c с помощью параметр конструктора с универсальным интерфейсом c:

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

Затем я определяю производный тип, используя производный интерфейс:

type DataModelDomain ( getRepository:System.Func<IDataModelRepository>) =
inherit Domain<DataModel> (getRepository)

Это не компилируется, выдавая сообщение об ошибке на Тип DataModelDomain:

Тип 'IRepository' не соответствует типу 'IDataModelRepository'

Однако, если я определю эти типы 'Domain' в классах в C# Компонент аналогичным образом, он компилируется. Есть ли способ определить тип DataModelDomain, основанный на типе домена generi c и использующий производный интерфейс IDataModelRepository

1 Ответ

1 голос
/ 17 февраля 2020

Я думаю, что мне удалось воспроизвести проблему при компиляции кода F #. И затем исправили это, создав новую функцию, вызвав другую внутри нее и безопасно передав результат: (fun () -> getRepository.Invoke() :> IRepository<DataModel>)

Вот и все:

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 ()
...