如何将列表转换为无数

时间:2010-06-19 12:01:51

标签: c# list ienumerable casting

我遇到以下代码的问题:

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这似乎是正确的。我错了吗?

4 个答案:

答案 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>