【问题标题】:How to cast list to enumerable如何将列表转换为可枚举
【发布时间】:2010-06-19 12:01:50
【问题描述】:

以下代码有问题:

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]”。

查看this SO question 似乎是正确的。我错了吗?

【问题讨论】:

    标签: c# list ienumerable casting


    【解决方案1】:

    应该没问题,只要 Session 实现 ISession - 如果您使用的是 C# 4 和 .NET 4。如果不是,则不会。

    请注意,您提到的问题在两种情况下都使用相同的“T” - 而您遇到的例外是将List&lt;Session&gt; 转换为IEnumerable&lt;ISession&gt;。您还没有说明您在哪里得到了异常,这使得很难确切地看到发生了什么......您确定这是实际上失败的代码吗?你确定你得到的是异常而不是编译时失败吗?

    编辑:如果您不使用 .NET 4 和 C# 4,协方差的解决方法在这里相当简单 - 使用 Cast&lt;T&gt;() LINQ 运算符:

    return sessionList.Cast<ISession>();
    

    【讨论】:

    • 谢谢你,乔恩,是的,Session 实现了 Isession 接口。 try - catch 块位于我发布的开始和结束时。尝试 { using (ProvaDbEntities DBEntities = new ProvaDbEntities(Utilities.ToEntitiesConnectionString())) ... 是的,我确定,我得到一个异常返回 res; } } catch (Exception e) { throw new UnavailableDbException("[GetSessions!!-------------- (site)]" + e.Message); }
    • @trifabbio:通过抛出一个新的异常,你隐藏了它被抛出的那一行。 (捕捉异常通常也是一个坏主意。)奇怪的是你的代码没有显示任何强制转换。您确定在 return 语句或对 res 的赋值中没有强制转换吗?
    • 是的,乔恩,我有演员表.. List sessionList = new List(); foreach (var s in q1) { sessionList.Add(new Session(s.id.ToString(),s.username, s.site, new DateTime())); } IEnumerable res = sessionList;返回 (IEnumerable)re​​s;如果我不在返回行中进行强制转换,我会得到一个静态错误并且我不能编译。我确认 Session 类实现了 ISession 接口。我快疯了..
    • @trifabbio:对。因此,您发布的代码不是您拥有的代码...不要再这样做了。当我们看不到您的代码时,我们该如何调试错误?根据我的第一句话,我怀疑您使用的是 .NET 3.5 或更低版本——它不支持通用协方差。如果您从一开始就发布了您正在使用的平台,那会很有用。我将使用解决方法编辑我的答案。
    • 对不起,乔恩,你是对的。是的,我使用的是 .NET 3.5。 SP1。坦克法比奥
    【解决方案2】:

    您是否尝试过使用扩展方法 AsEnumerable()?

    所以这一行

    IEnumerable<Session> res = sessionList;
    

    会改成

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

    【讨论】:

    • 为什么会有帮助? List&lt;T&gt; 已经实现了 IEnumerable&lt;T&gt;
    【解决方案3】:

    返回类型是publicIEnumerable&lt;ISession&gt;,忘记指定Ienumerable的类型了..

    【讨论】:

      【解决方案4】:

      您可以添加using System.Linq 并使用返回IEnumerable&lt;T&gt; 的扩展方法Cast&lt;T&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-02
        • 2013-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        • 2021-05-07
        相关资源
        最近更新 更多