Не удалось создать экземпляр типа.Тип является интерфейсом или абстрактным классом и не может быть создан - PullRequest
0 голосов
/ 28 января 2019

Я понимаю, что приведенное ниже решение работает нормально, но, похоже, не работает для сбораПолучение «Невозможно неявно преобразовать тип System.Collections.Generic.IList<Something> в System.Collections.Generic.IList<ISomething>. Существует явное преобразование (вам не хватает приведения?)», Если я попытался назначить IList<Something> для IList<ISomething> в конструкторе.Любые предложения?

Рабочий код:

public class Foo
{ 
    public int Number { get; private set; }

    public ISomething IsSomething { get; private set; }

    public Foo(int number, Something concreteType)
    {
        Number = number;
        IsSomething = concreteType;
    }
}

Не работает:

public class Foo
{ 
    public int Number { get; private set; }

    public IList<ISomething> IsSomething { get; private set; }

    public Foo(int number, IList<Something> concreteType)
    {
        Number = number;
        IsSomething = concreteType; //getting error
    }
}

ConvertAll, кажется, решить проблему.

1 Ответ

0 голосов
/ 28 января 2019

Как указывал @HimBromBeere, если то, что вы пытались разрешить, эти списки стали бы разных типов и нарушали бы безопасность типов.Вы можете сослаться на отличный ответ от JonSkeet здесь: Список приведения в Список

Чтобы ваш код работал, вам нужно будет выполнить преобразование, как указано в ответе JonSkeetили вы также можете использовать метод ConvertAll.

public class Foo
{ 
  public int Number { get; private set; }
  public IList<ISomething> IsSomething { get; private set; }
  public Foo(int number, IList<Something> concreteType)
  {
    Number = number;

    // convert here, creates a new list
    IsSomething = concreteType.ConvertAll(x => (ISomething)x);
  }
}
...