2017-05-26 29 views
-2

https://github.com/tommcclean/XContextC#試圖返回泛型列表「無法implictly轉換型」

我寫一個庫,用於存儲和文件系統使用XML文件中檢索數據。一個名爲XMemory的類應該像檢索緩存一樣檢索值。

第1步:從任何對象加載XML文件。使用存儲在文件中的序列化XML。

DemoEntity. 

第2步:將XML反序列化到對象列表中。

List<DemoEntity>. 

第3步:存儲對象在類屬性中的列表供以後檢索。

問題:我使用T來允許我在運行時傳入對象。我無法從內存中檢索列表並返回列表。

注意:XEntity是任何受支持的對象必須實現的接口才能使用此庫。

internal class XMemory 
{ 
    private List<List<XEntity>> EntityContents { get; set; } = new List<List<XEntity>>(); 

    internal List<T> Read<T>() 
    { 
     var entityContent = EntityContents.FirstOrDefault(); 

     return entityContent; 
    } 
} 

錯誤顯示爲「無法implictly轉換型‘System.Collections.Generic.List’到‘System.Collections.Generic.List’

+0

我不明白這裏泛型的用途是什麼。你有一個實際的例子嗎? –

+0

我希望能夠在其他項目中添加此庫作爲參考。該項目不會意識到我的其他項目中創建的對象。所以我使用T是因爲這個原因。所以我可以創建一個對象並讓庫將其序列化爲XML,然後檢索它 –

+0

對不起,如果我無法很好地解釋問題。我已經添加了一個鏈接到我的項目,如果這有幫助(https://github.com/tommcclean/XContext)演示項目強調我試圖實現 –

回答

3

的問題是,編譯器沒有辦法知道,不管的EntityContents裏面的T一個實例。因此,您需要明確地施加值:

internal List<T> Read<T>() 
{ 
    return EntityContents.First().Cast<T>().ToList() 
} 
0

你應該說明T應該實現的類型(如果我們正在發言的接口)OT繼承(如果我們講了一類)的XEntity:儘管上述變化會使代碼編譯成功

internal List<T> Read<T>() where T : XEntity 
{ 
    var entityContent = EntityContents.FirstOrDefault(); 

    return entityContent; 
} 

,我無法理解的目的你的班級和它的方法

0

你的函數總是返回List<XEntity>,而你寫下它可以返回List<T>。所以T可以不是XEntity

我會建議你做這個類通用,並返回它的T:

internal class XMemory<T> 
{ 
    private List<List<T>> EntityContents { get; set; } = new List<List<T>>(); 

    internal List<T> Read<T>() 
    { 
     var entityContent = EntityContents.FirstOrDefault(); 

     return entityContent; 
    } 
} 
+0

感謝您的回覆。我無法做到這一點,因爲XMemory應該存儲很多不同對象的內容。這就是爲什麼我試圖使用接口爲所有對象提供公共元素的原因。如果我做這個改變,我只能存儲一種類型。 –