Как привести список к перечисляемому - PullRequest
1 голос
/ 19 июня 2010

У меня проблема со следующим кодом:

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.Перечислите `1 [prova3.Session] 'для ввода' System.Collections.Generic.IEnumerable`1 [TAP2009.AuctionSite.Interfaces.ISession] '.

Просмотр этого СО вопроса это кажется правильным.Я не прав?

Ответы [ 4 ]

5 голосов
/ 19 июня 2010

Все должно быть хорошо, если Session реализует ISession - , если вы используете C # 4 и .NET 4. Если нет, то не будет.

Обратите внимание, что в вопросе, на который вы ссылались, в обоих случаях используется одна и та же буква "Т", тогда как у вас есть исключение о преобразовании List<Session> в IEnumerable<ISession>. Вы не указали, где вы получаете исключение, из-за чего немного сложнее точно понять, что происходит ... Вы уверены, что это на самом деле код, который не выполняется? Вы уверены, что получаете исключение, а не ошибку во время компиляции?

РЕДАКТИРОВАТЬ: Если вы не используете .NET 4 и C # 4, обходной путь для ковариации здесь достаточно прост - используйте оператор Cast<T>() LINQ:

return sessionList.Cast<ISession>();
1 голос
/ 19 июня 2010

Вы пытались использовать метод расширения AsEnumerable ()?

Так что эта строка

IEnumerable<Session> res = sessionList;

изменится на

IEnumerable<Session> res = sessionList.AsEnumerable();
0 голосов
/ 19 июня 2010

Вы можете добавить using System.Linq и использовать метод расширения Cast<T>, который возвращает IEnumerable<T>.

0 голосов
/ 19 июня 2010

Тип возвращаемого значения: public IEnumerable<ISession>, я забыл указать тип Ienumerable ..

...