【问题标题】:Initialize IList<T> C#初始化 IList<T> C#
【发布时间】:2018-12-11 20:24:26
【问题描述】:

有初始化IList&lt;T&gt; 的特殊方法吗?这似乎不起作用:

IList<ListItem> allFaqs = new IList<ListItem>();
// Error I get here: Cannot create an instance of the interface 'IList<ListItem>'

ReSharper 建议像这样初始化它:

IList<ListItem> allFaqs = null;

但是当我向这个列表添加项目时,这不会导致空引用异常吗?

或者我应该只使用List&lt;ListItem&gt;

谢谢!

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    错误是因为您正在尝试创建接口的实例。

    将您的代码更改为:

    List<ListItem> allFaqs = new List<ListItem>();
    

    IList<ListItem> allFaqs = new List<ListItem>();
    

    它应该可以编译。

    您显然也必须更改其余代码以适应。

    你可以像这样创建任何实现IList的具体类型,所以

    IList<ListItem> test = new ListItem[5];
    
    IList<ListItem> test = new ObservableCollection<ListItem>(allFaqs);
    

    等等,都会起作用。

    【讨论】:

    • 如果我想使用 IList 作为数组和列表的最通用类型怎么办?
    • @EduardoPignatelli 你可以使用任何实现IList 的东西。我添加了几个示例。
    【解决方案2】:

    您的问题是 IList 是一个接口,而不是一个类。不能初始化接口。

    您可以拥有一个接口的实例,但您需要使用实现该接口的类对其进行初始化,例如:

    IList<string> strings = new List<string>();
    

    前面的代码行将起作用,但您将只能使用 IList 的成员,而不是您初始化的任何类的完整集合。

    【讨论】:

      【解决方案3】:

      IList 不是一个类;它是类可以实现的接口。接口本身只是类的消费者和类本身之间的契约。这行代码可以工作:

      IList<ListItem> allFaqs = new List<ListItem>();
      

      这有帮助吗?

      【讨论】:

        【解决方案4】:

        你需要做的:

        IList<ListItem> allFaqs = new List<ListItem>();
        

        在您的代码中,您正在尝试初始化一个接口。

        【讨论】:

          【解决方案5】:

          IList 是一个接口,因此您无法实例化它。各种类都实现了 IList。实现 IList 的此类类之一是 List。你可以像这样实例化它:

          List<ListItem> allFaqs = new List<ListItem>();
          

          【讨论】:

            【解决方案6】:

            你不能实例化一个接口(IList 是一个接口)。

            您需要实例化实现 IList 的东西,

            像这样:

            IList<ListItem> allFaqs = new List<ListItem>();
            

            还有其他类型的 IList,但 List 是一个不错的起点。

            【讨论】:

              【解决方案7】:

              IList 是一个接口,而不是一个类。如果你想初始化它,你需要将它初始化为一个实现IList的类,这取决于你内部的具体需求。通常,IList 使用 List 进行初始化。

              IList<ListItem> items = new List<ListItem>();
              

              【讨论】:

                【解决方案8】:

                IList&lt;T&gt; 是一个接口。你需要实例化一个实现接口的类:

                IList<ListItem> allFaqs = new List<ListItem>();
                

                List&lt;T&gt; 实现IList&lt;T&gt;,因此可以分配给变量。还有其他类型也实现了IList&lt;T&gt;

                【讨论】:

                  猜你喜欢
                  • 2012-02-27
                  • 2023-03-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-08-10
                  • 2012-02-10
                  • 2017-06-10
                  • 1970-01-01
                  • 2020-07-03
                  相关资源
                  最近更新 更多