在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.
    }
}

在c#的方法上下文中不能识别列表实例

您的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