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

时间:2017-05-26 19:03:33

标签: c# xml generics

https://github.com/tommcclean/XContext

我正在编写一个库,它使用文件系统上的XML文件存储和检索数据。一个名为XMemory的类应该像缓存一样保存一次。

步骤1:从任何对象加载XML文件。使用存储在文件中的序列化XML。

DemoEntity.

第2步:将XML反序列化为对象列表。

List<DemoEntity>.

步骤3:将对象列表存储在类属性中以供以后检索。

问题:我使用T来允许我在运行时传入对象。我无法从内存中的List中检索并作为List返回。

注意: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;
    }
}

错误显示“无法将类型'System.Collections.Generic.List'隐含地转换为'System.Collections.Generic.List'

3 个答案:

答案 0 :(得分:3)

问题是编译器无法知道EntityContents内部的任何内容是T的实例。因此,您需要明确地转换值:

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

答案 1 :(得分:0)

你应该说明T应该实现的类型(如果我们正在为一个接口说话),那么继承(如果我们正在为一个类说话)XEntity

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

    return entityContent;
}

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

答案 2 :(得分: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;
    }
}