通用类实现中的新List <t> </t>

时间:2013-03-17 09:15:22

标签: c# generics

尝试创建列表的通用实现。我的班级将是:

public class SpecialList <T>
{ 
    private List <T> mylist;

    public void SpecialList <T>() 
    { 
        mylist = new List <T>()
    }
}

此代码无法编译b / c“无法隐式转换类型....列表到...列表...”我错过了什么?

5 个答案:

答案 0 :(得分:8)

这一行存在两个问题:

public void SpecialList <T>() 

首先,当我怀疑你希望它是一个构造函数时,你声明一个带有void返回类型的方法

其次,它是一个泛型方法 - 它引入了一个与现有类型参数无关的新类型参数T。这就是转换不起作用的原因。想象一下它写成:

public void MyGenericMethod<TOther>()
{
    List<T> x = new List<TOther>();
}

...那么这显然是错的,是吗?

你只需要这样的构造函数:

public SpecialList()
{
    ...
}

(作为旁注,通常情况下,类型参数不会像空格那样用空格分隔。例如,它通常是List<T>而不是List <T>。值得改变你的习惯,以配合大多数人使用的惯例。)

答案 1 :(得分:4)

你的课应该是

public class SpecialList <T>
{ 
    private List <T> mylist;

    public SpecialList() 
    { 
        mylist = new List <T>();
    }
}

当然如果你的类看起来像一个集合,你可能想要实现一个或多个集合接口,例如

public class SpecialList <T> : ICollection<T>
{ 
    private List <T> mylist;

    public SpecialList() 
    { 
        mylist = new List <T>();
    }

    // ICollection<T>.Add
    public void Add(T item)
    {
        // delegate to myList
        myList.Add(item);
    }

    ... /Clear/Contains/CopyTo/ etc
}

答案 2 :(得分:2)

问题是<{1>} <\ n> <

void SpecialList<T>()

答案 3 :(得分:1)

那是因为您无法使用任何通用参数定义构造函数。 你可以做的只是删除通用的特定代码。

public class SpecialList <T>
{ 
    private List <T> mylist;

    public SpecialList() 
    { 
        mylist = new List <T>();
    }
}

答案 4 :(得分:1)

构造函数中不需要 T

它使编译器认为它是类上使用的 T 以外的类型。

这就是为什么它说不能将它从 List (其中 T 来自类)转换为 List (其中 T < / em>来自构造函数)。