我试图理解为什么编译器在我尝试在此上下文中使用“List”特定方法“Add”时会抛出错误。错误说明表明它是由于字段定义。 (IEnumerable不包括“添加”方法)但是,我在内部上下文中新建了它。我将感激合理的解释。
注意:我知道这是因为IEnumerable是一个接口,我可以使用IList。但是,我无法理解的是编译器应该在内部上下文中提取类型但不是。
class Program
{
private static IEnumerable<string> exampleList;
public static void Main()
{
exampleList = new List<string>();
exampleList.Add("ex"); // ==> Compiler Error Here.
}
}
答案 0 :(得分:3)
您的exampleList
被定义为IEnumerable<string>
,因此其编译时类型为IEnumerable<string>
。因此,当编译器编译代码时,它只能知道它是IEnumerable<string>
。
存在两个主要修复:
1)将exampleList声明为IList
private static IList<string> exampleList;
2)使用临时变量设置列表内容。
public static void Main()
{
var list = new List<string>();
list.Add("ex");
exampleList = list;
}
只是简单解释为什么编译器只能知道它是IEnumerable,请考虑以下代码:
IEnumerable<string> exampleList;
if (TodayIsAWednesday())
{
exampleList = new List<string>();
}
else
{
exampleList = new string[0];
}
// How can the compiler know that exampleList is a List<string>?
// It can't!
exampleList.Add("ex");
答案 1 :(得分:0)
如下更改您的代码,将解决问题。
private static List<string> exampleList;
或更改静态Main中的代码,如下所示
var newCollection = exampleList.ToList();
newCollection.Add("ex"); //is your new collection with the item added
答案 2 :(得分:0)
如你所见,&#34;我&#34;意味着它是一个Interface.It可以接受所有类型的Enumerable,但没有Add的方法。 您可以看到:https://msdn.microsoft.com/en-us//library/system.collections.ienumerable(v=vs.110).aspx