无法将IEnumerable类型转换为List

CC *_*Inc 9 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

arc*_*hil 12

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

public List<URL> GetHistory()
Run Code Online (Sandbox Code Playgroud)

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

List<URL> calledList = (List<URL>)myClass.GetHistory();
Run Code Online (Sandbox Code Playgroud)

或者从结果中构建新列表

List<URL> calledList = new List<URL>(myClass.GetHistory());
Run Code Online (Sandbox Code Playgroud)

如果您不需要List功能,则可以将其定义calledList为IEnumerable

var calledList = myClass.GetHistory();
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以在枚举上调用.ToList(). (10认同)