尝试创建列表的通用实现。我的课是:
public class SpecialList <T>
{
private List <T> mylist;
public void SpecialList <T>()
{
mylist = new List <T>()
}
}
这段代码不能编译 b/c “不能隐式地将类型 ....List 转换为 ... List ...”我错过了什么?
这条线有两个问题:
public void SpecialList <T>()
首先,当我怀疑您希望它成为构造函数时,您正在声明一个具有返回类型的方法。void
其次,它是一个泛型方法——它引入了一个T
与现有类型参数无关的新类型参数。这就是转换不起作用的原因。想象一下它被写成:
public void MyGenericMethod<TOther>()
{
List<T> x = new List<TOther>();
}
...那显然是错误的,是吗?
您只需要这样的构造函数:
public SpecialList()
{
...
}
(作为旁注,通常类型参数不会像您所做的那样用空格与声明分隔。通常是这样List<T>
而不是List <T>
例如。可能值得改变您的习惯以匹配大多数其他人使用的约定.)
你的课应该是
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
}
问题是不能定义为的构造void SpecialList<T>()
:
public class SpecialList<T> {
private List<T> mylist;
public SpecialList( ) {
mylist = new List<T>( );
}
}
那是因为您不能使用任何通用参数定义构造函数。您可以做的只是删除通用的特定代码。
public class SpecialList <T>
{
private List <T> mylist;
public SpecialList()
{
mylist = new List <T>();
}
}
您不需要T在构造函数中。
它使编译器认为它是类上使用的T以外的类型。
这就是为什么它说不能将它从List(其中T来自类)转换为List(其中T来自构造函数)。