无法将IEnumerable类型转换为List

时间:2012-06-26 12:06:07

标签: c#

我几年来一直在使用C#和Unity3d,但我刚开始使用.NET编程。我收到错误:

无法将类型“System.Collections.Generic.IEnumerable<URL>”隐式转换为“System.Collections.Generic.List<URL>”。存在显式转换(您是否错过了演员?)

这是我的代码:

namespace TestBrowserHistory
{
    public class Test1
    {
        public Test1()
        {

        }
          static void Main()
    {
        InternetExplorer myClass = new InternetExplorer();
        List<URL> calledList = myClass.GetHistory();
        Console.WriteLine("Hello!");
        Console.WriteLine(calledList[1]);
        Console.ReadLine();
    }
    }
}

public class InternetExplorer
{
    // List of URL objects
    public List<URL> URLs { get; set; }
    public IEnumerable<URL> GetHistory()
    {
        // Initiate main object
        UrlHistoryWrapperClass urlhistory = new UrlHistoryWrapperClass();

        // Enumerate URLs in History
        UrlHistoryWrapperClass.STATURLEnumerator enumerator =
                                           urlhistory.GetEnumerator();

        // Iterate through the enumeration
        while (enumerator.MoveNext())
        {
            // Obtain URL and Title
            string url = enumerator.Current.URL.Replace('\'', ' ');
            // In the title, eliminate single quotes to avoid confusion
            string title = string.IsNullOrEmpty(enumerator.Current.Title)
                      ? enumerator.Current.Title.Replace('\'', ' ') : "";

            // Create new entry
            URL U = new URL(url, title, "Internet Explorer");

            // Add entry to list
            URLs.Add(U);
        }

        // Optional
        enumerator.Reset();

        // Clear URL History
        urlhistory.ClearHistory();

        return URLs;
    }

}

感谢您的帮助!

8 个答案:

答案 0 :(得分:11)

您收到该错误是因为myClass.GetHistory();返回IEnumerable<URL>,这在编译时与List<URL>不同,尽管它在运行时实际上是List<URL>。更改方法签名以返回List<URL>,因为您已经这样做了

public List<URL> GetHistory()

其他解决方法是将方法调用结果转换为List<URL>

List<URL> calledList = (List<URL>)myClass.GetHistory();

或者从结果构建新列表

List<URL> calledList = new List<URL>(myClass.GetHistory());

如果您不需要列表功能,可以将calledList定义为IEnumerable

var calledList = myClass.GetHistory();

答案 1 :(得分:3)

您对GetHistory方法的定义会返回一个IEnumerable,并且您将其分配给IList。更改定义或用法。

如果您不需要更改集合,我会将GetHistory的定义更改为IEnumerable。

答案 2 :(得分:3)

List是IEnumerable,但反之则不然。

如果您需要列表操作,则应更改方法以返回IList&lt;&gt;而不是IEnumerable。或者,您应该将返回值分配给IEnumerable变量而不是List。这将限制你(无需进一步操作)IEnumerable方法(你可以做一个foreach并使用LINQ之类的东西,比如.First,但你不能通过特定的位置来引用,例如)。这可能足以满足您最终的需求。

答案 3 :(得分:1)

这是错误

List<URL> calledList = myClass.GetHistory(); 

由于GetHistory方法返回IEnumerable<URL>

public IEnumerable<URL> GetHistory()

编辑:

解决方案:只需将GetHistory()方法的返回值更改为IList<T>

答案 4 :(得分:1)

要使工作正常,您只需将GetHistory()方法的返回类型更改为List<URL>

您可以将List类型转换为IEnumerable,但不是相反。编译器被告知GetHistory返回IEnumerable,即使它一个列表,它也不知道。

答案 5 :(得分:1)

除了别人所说的,你可以简单地说:

GetHistory();
List<URL> calledList = URLs;

由于GetHistory无论如何都会将URLs修改为副作用,因此几乎没有从中返回任何结果的目的。除此之外,您可能会考虑GetHistory是否需要显式地调用 - 也许在首次调用URLs getter时,应该隐式执行等效代码?< / p>

另外,为什么你没有使用foreach

答案 6 :(得分:0)

只需添加

yield return U;

结束时阻止并删除

 return URLs;

之后该功能就像这样

public IEnumerable<URL> GetHistory()
{
    // Initiate main object
    UrlHistoryWrapperClass urlhistory = new UrlHistoryWrapperClass();

    // Enumerate URLs in History
    UrlHistoryWrapperClass.STATURLEnumerator enumerator =
                                       urlhistory.GetEnumerator();

    // Iterate through the enumeration
    while (enumerator.MoveNext())
    {
        // Obtain URL and Title
        string url = enumerator.Current.URL.Replace('\'', ' ');
        // In the title, eliminate single quotes to avoid confusion
        string title = string.IsNullOrEmpty(enumerator.Current.Title)
                  ? enumerator.Current.Title.Replace('\'', ' ') : "";

        // Create new entry
        URL U = new URL(url, title, "Internet Explorer");

        // Add entry to list
        URLs.Add(U);
        yield return U;
    }

    // Optional
    enumerator.Reset();

    // Clear URL History
    urlhistory.ClearHistory();


}

答案 7 :(得分:0)

您可以只使用Linq lamda提供的tolist()从IEnumerable转换为List。

using System.Linq;

List<URL> calledList = myClass.GetHistory().ToList();