2010-03-29 69 views
1

我是C#的新手,並被困在以下內容中。我有一個使用LINQ查詢ADO.NET實體對象的Silverlight Web服務。例如:通用列表類型轉換問題

[OperationContract] 
public List<Customer> GetData() 
{ 
    using (TestEntities ctx = new TestEntities()) 
    { 
     var data = from rec in ctx.Customer 
        select rec; 
     return data.ToList(); 
    } 
} 

這工作正常,但我想要做的就是讓這個更抽象。第一步將是返回一個List<EntityObject>但是這給出了一個編譯器錯誤,例如:

[OperationContract] 
public List<EntityObject> GetData() 
{ 
    using (TestEntities ctx = new TestEntities()) 
    { 
     var data = from rec in ctx.Customer 
        select rec; 
     return data.ToList(); 
    } 
} 

的錯誤是:

Error 1 Cannot implicitly convert type 'System.Collections.Generic.List<SilverlightTest.Web.Customer>' to 'System.Collections.Generic.IEnumerable<System.Data.Objects.DataClasses.EntityObject>'. An explicit conversion exists (are you missing a cast?) 

我到底做錯了什麼?

感謝,

AJ

回答

3

即使從EntityObjectCustomer繼承,List<Customer>不從List<EntityObject>繼承,因爲不支持泛型類型的協方差(在C#4.0中,協方差支持接口,但不爲IList<T>)。

如果你可以指定一個List<Customer>List<EntityObject>類型的變量,它會允許你做這樣的事情:

List<EntityObject> list = new List<Customer>(); 
list.Add(new Product()); // assuming Product inherits from EntityObject 

此代碼顯然是打破:你不能添加ProductList<Customer> 。這就是爲什麼它是不允許

0
[OperationContract] 
public List<EntityObject> GetData() 
{ 
    using (TestEntities ctx = new TestEntities()) 
    { 
     var data = from rec in ctx.Customer 
        select (EntityObject)rec; 
     return data.ToList(); 
    } 
} 

你無法演員名單列出即使d從B.這就是所謂的協方差派生,並只用陣列工作。它將在C#4.0中完全引入。

0

您的var數據包含Customer對象,您的返回值是一個包含EntityObjects的列表。

你必須丟掉。

data.ConvertAll(obj => (EntityObject) obj).ToList(); 
+0

我喜歡這個,但數據不具有ConvertAll方法並沒有爲我工作。 – 2010-03-29 12:10:59

0

你可以做

data.Cast<EntityObject>().ToList();