我遇到以下代码的问题:
public IEnumerable<ISession> GetSessions()
{
// ...
using (ProvaDbEntities DBEntities = new ProvaDbEntities(Utilities.ToEntitiesConnectionString()))
{
ObjectQuery<session> sessions = DBEntities.session;
IEnumerable<session> q1 = from session in sessions
where session.site == this.Name
select session;
List<Session> sessionList = new List<Session>();
foreach (var s in q1)
{
sessionList.Add(new Session(s.id.ToString(),s.username, s.site, new DateTime()));
}
IEnumerable<Session> res = sessionList;
return sessionList;
}
}
例外是:
无法将对象类型'System.Collections.Generic.List`1 [prova3.Session]'转换为'System.Collections.Generic.IEnumerable`1 [TAP2009.AuctionSite.Interfaces.ISession]'。< / p>
看this SO question这似乎是正确的。我错了吗?
答案 0 :(得分:5)
应该没问题,只要Session
实现ISession
- 如果你正在使用C#4和.NET 4.如果你不是,那就赢了不会。
请注意,您提到的问题在两种情况下都使用相同的“T” - 而您获得的例外情况是将List<Session>
转换为IEnumerable<ISession>
。你没有说明你获得异常的地方,这使得更难以确切地看到发生了什么......你确定这是实际上失败的代码吗?你确定你得到的是异常而不是编译时失败吗?
编辑:如果您不使用.NET 4和C#4,协方差的解决方法在这里相当简单 - 使用Cast<T>()
LINQ运算符:
return sessionList.Cast<ISession>();
答案 1 :(得分:1)
您是否尝试过使用扩展方法AsEnumerable()?
所以这一行
IEnumerable<Session> res = sessionList;
会改为
IEnumerable<Session> res = sessionList.AsEnumerable();
答案 2 :(得分:0)
返回类型为public IEnumerable<ISession>
,我忘了指定Ienumerable
的类型..
答案 3 :(得分:0)
您可以添加using System.Linq
并使用返回Cast<T>
的扩展程序IEnumerable<T>
。