2010-06-19 35 views
1

我有下面的代碼有問題:如何投放列表枚舉

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它似乎是正確的。我錯了嗎?

回答

0

返回類型是公共IEnumerable<ISession>,我忘了指定Ienumerable的類型..

+0

???我不能把「<" and ">」字符?再試一次.. IEnumerable < ISession > – trifabbio 2010-06-19 12:07:42

+0

您需要使用反引號來告訴markdown它的代碼。 – 2010-06-19 12:08:17

5

應該沒事,只要Session實現ISession - 如果你使用C#4和.NET如果你不是,它不會。

請注意,您提到的問題在兩種情況下都使用相同的「T」 - 而您所得到的例外是關於將List<Session>轉換爲IEnumerable<ISession>。你還沒有說明你在哪裏得到例外,這使得有點難以看到究竟是怎麼回事......你確定這是實際上是這是失敗的代碼?你確定你得到一個異常而不是編譯時失敗?

編輯:如果你不使用.NET 4和C#4,對於協方差的解決方法是相當簡單的在這裏 - 使用LINQ Cast<T>()操作:

return sessionList.Cast<ISession>(); 
+0

坦克你,是的,會話實現接口Isession。 try-catch塊在我發佈的come的開頭和結尾處。 嘗試 { 使用(ProvaDbEntities DBEntities =新ProvaDbEntities(Utilities.ToEntitiesConnectionString())) ... 是的,我敢肯定,I'getting異常 返回水庫; (異常e) { }拋出新的UnavailableDbException(「[GetSessions !! --------------(site)]」+ e.Message); } – trifabbio 2010-06-19 15:43:38

+0

@trifabbio:通過拋出一個新的異常,你隱藏了它被拋出的那一行。 (捕捉異常通常也是一個糟糕的主意。)奇怪的是,你的代碼沒有顯示任何強制轉換。你確定你沒有在回報聲明或分配給水庫的演員? – 2010-06-19 15:46:42

+0

是的,我有一個演員.. 列表 sessionList = new List (); foreach(var in q1) { sessionList.Add(new Session(s.id.ToString(),s.username,s.site,new DateTime())); } IEnumerable res = sessionList; return(IEnumerable )res; 如果我沒有在返回行中進行強制轉換,我會得到一個靜態錯誤,我可以編譯。 我確認類Session實現接口ISession。 我很開心.. – trifabbio 2010-06-19 16:19:01

1

您是否嘗試過使用擴展方法AsEnumerable( )?

所以這條線

IEnumerable<Session> res = sessionList; 

將變爲

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

爲什麼會有幫助? '列表'已經實現'IEnumerable '。 – 2010-06-19 15:16:04

+0

我Duracell, 這不是解決方案,我仍然有問題.. – trifabbio 2010-06-19 15:45:04

0

您可以添加using System.Linq和使用擴展方法Cast<T>返回一個IEnumerable<T>