我几年来一直在使用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;
}
}
感谢您的帮助!
答案 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();