C# C“尝试返回通用列表”;无法隐式转换类型";

C# C“尝试返回通用列表”;无法隐式转换类型";,c#,xml,generics,C#,Xml,Generics,() 我正在编写一个库,它使用文件系统上的XML文件存储和检索数据。一个名为XMemory的类应该像缓存一样保存检索到的值 步骤1:从任何对象加载XML文件。使用存储在文件中的序列化XML DemoEntity. 步骤2:将XML反序列化到对象列表中 List<DemoEntity>. 列表。 步骤3:将对象列表存储在类属性中,以便以后检索 问题:我使用T允许我在运行时传入对象。我无法从内存中的列表中检索并作为列表返回 注意:XEntity是任何受支持对象都必须实现的接口,才能

()

我正在编写一个库,它使用文件系统上的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;
    }
}
内部类XMemory
{
私有列表EntityContent{get;set;}=new List();
内部列表读取()
{
var entityContent=EntityContents.FirstOrDefault();
返回实体内容;
}
}

错误显示为“无法将类型”System.Collections.Generic.List“隐式转换为”System.Collections.Generic.List“

您应该说明类型
T
应该实现(如果我们是为接口说话)而不是继承(如果我们是为类说话)
XEntity

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

    return entityContent;
}
internal List Read(),其中T:XEntity
{
var entityContent=EntityContents.FirstOrDefault();
返回实体内容;
}

尽管上述更改会使代码成功编译,但我无法理解您的类的用途及其方法。

您的函数总是返回
List
,而您编写的函数可以返回
List
。因此
t
不能是
XEntity

我建议您将该类设置为通用类,并返回它的:

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;
    }
}
内部类XMemory
{
私有列表EntityContent{get;set;}=new List();
内部列表读取()
{
var entityContent=EntityContents.FirstOrDefault();
返回实体内容;
}
}

问题在于编译器无法知道
EntityContent
中的任何内容都是
T
的实例。因此,需要显式转换值:

internal List<T> Read<T>()
{
    return EntityContents.First().Cast<T>().ToList()
}
内部列表读取()
{
返回EntityContent.First().Cast().ToList()
}

我不明白泛型的目的是什么。你有一个实际的例子吗?我希望能够在其他项目中添加此库作为参考。此项目不会知道在我的其他项目中创建的对象。因此,我使用t。因此,我可以创建一个对象,并让库将其序列化为XML和l如果我不能很好地解释这个问题,那就很抱歉了。我已经添加了一个到我的项目的链接,如果这有帮助的话()演示项目突出了我试图实现的目标。这让人困惑,但我想你想要的是
返回EntityContents.First().Cast().ToList()
谢谢Kevin,这正是我想要的。你能发布一个答案,这样我就可以将问题标记为已解决吗?谢谢你的回复。我不能这样做,因为XMemory应该存储许多不同对象的内容。这就是为什么我尝试使用一个接口为所有对象提供一个公共元素。如果我这样做nge我只能存储一种类型。