How to cast list to enumerable

那年仲夏 提交于 2019-12-24 07:48:15

问题


I've got a problem with the following code:

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;
    }
}

The exception is:

Is not possible to cast object type 'System.Collections.Generic.List`1[prova3.Session]' to type 'System.Collections.Generic.IEnumerable`1[TAP2009.AuctionSite.Interfaces.ISession]'.

Looking at this SO question it seems to be correct. Am I wrong?


回答1:


It should be fine, so long as Session implements ISession - if you're using C# 4 and .NET 4. If you're not, it won't be.

Note that the question you referred to use the same "T" in both cases - whereas the exception you've got is about converting a List<Session> to an IEnumerable<ISession>. You haven't stated where you're getting the exception, which makes it a bit harder to see exactly what's going on... Are you sure this is actually the code which is failing? Are you sure you're getting an exception rather than a compile-time failure?

EDIT: If you're not using .NET 4 and C# 4, the workaround for covariance is reasonably simple here - use the Cast<T>() LINQ operator:

return sessionList.Cast<ISession>();



回答2:


Have you tried using the extension method AsEnumerable()?

So this line

IEnumerable<Session> res = sessionList;

Would change to

IEnumerable<Session> res = sessionList.AsEnumerable();



回答3:


The return type is public IEnumerable<ISession>, i forgot to specify the type of the Ienumerable..




回答4:


You can add using System.Linq and use the extension method Cast<T> that returns a IEnumerable<T>.



来源:https://stackoverflow.com/questions/3075393/how-to-cast-list-to-enumerable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!