12

几年来我一直在使用 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;
    }

}

谢谢你的帮助!

4

8 回答 8

19

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

public List<URL> GetHistory()

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

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

或从结果构造新列表

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

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

var calledList = myClass.GetHistory();
于 2012-06-26T12:11:36.587 回答
3

List 是 IEnumerable,但反之则不然。

如果需要列表操作,则应更改方法以返回 IList<> 而不是 IEnumerable。或者,您应该将返回值分配给 IEnumerable 变量而不是 List。这将限制您(无需进一步操作)IEnumerable 方法(例如,您可以执行 foreach 并使用 .First 之类的 LINQ 方法,但您不能按特定位置引用)。这可能足以满足您最终的需要。

于 2012-06-26T12:13:09.480 回答
3

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

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

于 2012-06-26T12:08:50.600 回答
1

这是错误

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

由于GetHistory方法返回IEnumerable<URL>

public IEnumerable<URL> GetHistory()

编辑:

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

于 2012-06-26T12:08:53.000 回答
1

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

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

于 2012-06-26T12:10:47.133 回答
1

代替其他人所说的,您可以简单地:

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

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

另外,你为什么不使用foreach

于 2012-06-26T12:18:37.217 回答
1

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

using System.Linq;

List<URL> calledList = myClass.GetHistory().ToList();
于 2018-10-23T04:45:55.780 回答
0

只需添加

yield return U;

while 块结束并删除

 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();


}
于 2012-06-26T12:17:56.827 回答