无法转换泛型

时间:2015-04-20 19:55:47

标签: c# generics

我正在尝试从经理类调用方法BinaryFileDeSerialize,但是我遇到了转换问题。

public List<T> BinaryFileDeSerialize<T>(string filePath) where T : class
{
    var list = new List<T>();

    if (!File.Exists(filePath))
        throw new FileNotFoundException("The file" + " was not found. ", filePath);
    using (var fileStream = new FileStream(filePath, FileMode.Open))
    {
        BinaryFormatter b = new BinaryFormatter();

        while (fileStream.Position < fileStream.Length)
            list.Add((T)b.Deserialize(fileStream));
    }

    return list;
}

Manager上课:

private List<T> m_list;

public ListManager()
{
    m_list = new List<T>();
} 

public List<T> Open(string filename)
{
    BinSerializerUtility binSerial = new BinSerializerUtility();
    return binSerial.BinaryFileDeSerialize<List<T>>(filename); //<-- Errror

}

错误:

  

无法隐式转换类型   'System.Collections.Generic.List&GT;'   到'System.Collections.Generic.List

更新

我试过return binSerial.BinaryFileDeSerialize<T>(filename); 但我得到了错误:

  

类型'T'必须是引用类型才能将其用作参数   泛型类型或方法中的'T'   “Assign_1.BinSerializerUtility.BinaryFileDeSerialize(字符串)

2 个答案:

答案 0 :(得分:3)

更新您的Open()方法,使其具有引用类型的通用约束。

<强>更新

public List<T> Open<T>(string filename) where T: class
        {
            BinSerializerUtility binSerial = new BinSerializerUtility();
            return binSerial.BinaryFileDeSerialize<T>(filename); 

        }

答案 1 :(得分:0)

出现第一个错误,因为TList<T>,结果您得到List<List<T>>,要解决这个问题,您必须只传递T }。

第二个错误是因为方法BinaryFileDeSerialize具有T : class,这意味着T是引用类型。

public class ListManager<T> where T : class //  T is reference type
{
    private List<T> m_list;

    public ListManager()
    {
        m_list = new List<T>();
    }

    public List<T> Open(string filename)
    {
        BinSerializerUtility binSerial = new BinSerializerUtility();
        return binSerial.BinaryFileDeSerialize<T>(filename); // just T
    }
}