在c#的方法上下文中不能识别列表实例
本文关键字:不能 识别 列表 实例 上下文 方法 | 更新日期: 2023-09-27 18:08:15
我试图理解为什么当我尝试在这种情况下使用"List"特定方法"Add"时编译器会抛出错误。错误解释指出,这是由于字段定义。(IEnumerable不包括"Add"方法)然而,我在内部上下文中更新了它。如果你能给我一个合理的解释,我会很感激的。
注意:我知道这是因为IEnumerable是一个接口,我可以使用IList代替。然而,我不能理解的是,编译器应该在内部上下文中提取类型,但它不是。
class Program
{
private static IEnumerable<string> exampleList;
public static void Main()
{
exampleList = new List<string>();
exampleList.Add("ex"); // ==> Compiler Error Here.
}
}
您的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");
按如下代码修改,问题就解决了。
private static List<string> exampleList;
或更改静态Main中的代码,如下所示
var newCollection = exampleList.ToList();
newCollection.Add("ex"); //is your new collection with the item added
如您所见,"I"表示它是一个接口。它可以接受所有类型的Enumerable,但是没有Add的方法。您可以看到:https://msdn.microsoft.com/en-us//library/system.collections.ienumerable(v=vs.110).aspx