初始化IList <T> C#

And*_*ers 18 c# generics

有没有特定的方法来初始化IList<T>?这似乎不起作用:

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

ReSharper建议像这样初始化它:

IList<ListItem> allFaqs = null;
Run Code Online (Sandbox Code Playgroud)

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

或者我应该使用List<ListItem>

谢谢!

Chr*_*isF 47

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

将您的代码更改为:

List<ListItem> allFaqs = new List<ListItem>();
Run Code Online (Sandbox Code Playgroud)

要么

IList<ListItem> allFaqs = new List<ListItem>();
Run Code Online (Sandbox Code Playgroud)

它应该编译.

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

您可以创建任何具体的类型IList,如此

IList<ListItem> test = new ListItem[5];

IList<ListItem> test = new ObservableCollection<ListItem>(allFaqs);
Run Code Online (Sandbox Code Playgroud)

等等,一切都会奏效.


Jus*_*ner 17

你的问题是IList是一个接口,而不是一个类.您无法初始化界面.

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

IList<string> strings = new List<string>();
Run Code Online (Sandbox Code Playgroud)

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


Amy*_*Amy 6

伊利诺伊州不是一个阶级; 它是类可以实现的接口.接口本身只是类的使用者和类本身之间的契约.这行代码将起作用:

IList<ListItem> allFaqs = new List<ListItem>();
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?