Не существует неявного преобразования ссылок из «Type» в «Interface» - PullRequest
0 голосов
/ 31 октября 2018

У меня три интерфейса:

internal interface IAmAnInterfaceOne
{
    int PropertyOne { get; set; }
}

internal interface IAmAnInterfaceTwo
{
    int PropertyTwo { get; set; }
}

internal interface IAmAnInterfaceCombiningOneAndTwo : IAmAnInterfaceOne, IAmAnInterfaceTwo
{
}

Класс реализации:

internal class Myimplementation : IAmAnInterfaceOne, IAmAnInterfaceTwo
{
    public int PropertyOne { get; set; }
    public int PropertyTwo { get; set; }
}

Когда я пытался привязать интерфейс IAmAnInterfaceCombiningOneAndTwo к Myimplementation, я получил ошибку:

Нет неявного преобразования ссылок из 'Type' в 'Interface'

class AppModule : NinjectModule
{
    public override void Load()
    {
        Bind<IAmAnInterfaceCombiningOneAndTwo>().To<Myimplementation>().InSingletonScope();
    }
}

Я хочу использовать его в конструкторе так:

public class MyClass
{
    private readonly IAmAnInterfaceCombiningOneAndTwo _param;

    public MyClass(IAmAnInterfaceCombiningOneAndTwo param)
    {
        _param = param;
    }
}

Как правильно привязать интерфейс? Спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Это не ошибка Ninject.

IAmAnInterfaceCombiningOneAndTwo obj = new Myimplementation();

Приведенный выше код не будет компилироваться. Зачем? Потому что Myimplementation не реализует IAmAnInterfaceCombiningOneAndTwo. Он реализует IAmAnInterfaceOne и IAmAnInterfaceTwo.

IAmAnInterfaceCombiningOneAndTwo требует, чтобы эти два были реализованы, но простое их внедрение не означает также, что разработчик реализует интерфейс комбинации. Технически это совершенно другой интерфейс. В самом деле, вы можете добавить дополнительные требования к комбинированному интерфейсу, которые не включают ни IAmAnInterfaceOne, ни IAmAnInterfaceTwo.

Самое простое решение - изменить Myimplementation, чтобы явно объявить, что он реализует комбинированный интерфейс (либо дополнительно, либо только этот интерфейс - чистый эффект тот же):

internal class Myimplementation : IAmAnInterfaceCombiningOneAndTwo
...