【问题标题】:Could not create an instance of type . Type is an interface or abstract class and cannot be instantiated无法创建类型的实例。类型是接口或抽象类,不能实例化
【发布时间】:2019-01-28 09:41:35
【问题描述】:

我了解以下解决方案可以正常工作,但它似乎不适用于收集。如果我尝试在构造函数中将IList<Something> 分配给IList<ISomething>,则获取“无法将类型System.Collections.Generic.IList<Something> 隐式转换为System.Collections.Generic.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 似乎解决了这个问题。

【问题讨论】:

  • 我根本看不到您在哪里使用列表。无论如何,IList&lt;Derived&gt; 根本不是IList&lt;Base&gt;。想象一下:您可以强制转换为基类列表并将AnotherDerivedClass 的实例添加到该列表中:((ILlist&lt;ISomething&gt;)myList).Add(new MyEvilType())。现在你会有一个不同类型的列表。我怀疑这就是你想要的,是吗?
  • 如果我将 ctor 编码为:public Foo(int number, IList somethings) 并将 Foo 创建为: Foo foo = new Foo(1, new List (){ new Something()});
  • 您的问题是标题中的错误还是正文中的错误?他们是不同的。您的代码支持问题正文中的错误,但不支持标题中的错误。请澄清您在此处实际询问的内容。
  • 当我不使用构造函数时出现标题错误(即无法创建类型的实例。类型是接口或抽象类,无法实例化)。当我尝试使用构造函数并分配时,我得到“无法将类型 System.Collections.Generic.IList 隐式转换为 System.Collections.Generic.IList。存在显式转换(您是否缺少演员表?)” IsSomething = 具体类型。希望这很清楚。

标签: c# asp.net rest asp.net-web-api automapper


【解决方案1】:

正如@HimBromBeere 指出的那样,如果您尝试的操作被允许,这些列表将变成不同的类型并破坏类型安全。您可以在这里参考 JonSkeet 的出色回答:Cast List<T> to List<Interface>

要使您的代码正常工作,您必须按照 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);
  }
}

【讨论】:

  • 谢谢拉姆。这将带我进入下一步,但出现不同的错误,请参阅我更新的帖子
  • 谢谢,我已经接受了这个答案。将单独发布我的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多