0

尝试创建列表的通用实现。我的课是:

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

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

这段代码不能编译 b/c “不能隐式地将类型 ....List 转换为 ... List ...”我错过了什么?

4

5 回答 5

8

这条线有两个问题:

public void SpecialList <T>() 

首先,当我怀疑您希望它成为构造函数时,您正在声明一个具有返回类型的方法。void

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

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

...那显然是错误的,是吗?

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

public SpecialList()
{
    ...
}

(作为旁注,通常类型参数不会像您所做的那样用空格与声明分隔。通常是这样List<T>而不是List <T>例如。可能值得改变您的习惯以匹配大多数其他人使用的约定.)

于 2013-03-17T09:21:30.023 回答
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
}
于 2013-03-17T09:18:58.693 回答
2

问题是不能定义为的构造void SpecialList<T>()

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

    public SpecialList( ) {
        mylist = new List<T>( );
    }
}
于 2013-03-17T09:19:07.560 回答
1

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

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

    public SpecialList() 
    { 
        mylist = new List <T>();
    }
}
于 2013-03-17T09:21:22.563 回答
1

您不需要T在构造函数中。

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

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

于 2013-03-17T09:22:18.893 回答