通用列表c#

时间:2010-03-08 20:49:46

标签: c# list generics

c#中是否可以使用以下内容?

我有以下但最后一行不会编译,我错过了什么?

public static void BuildGeneric<T>(List<T> l)
{
    l = new List<T>();
    var anything = new object();
    l.Add(anything);
}

'System.Collections.Generic.List.Add(T)'的最佳重载方法匹配有一些无效的参数

4 个答案:

答案 0 :(得分:13)

public static void BuildGeneric<T>(List<T> l)
{
    l = new List<T>();
    var anything = new object();
    l.Add(anything);
}

应该是这个

public static void BuildGeneric<T>(out List<T> l)
{
    l = new List<T>();
    var anything = default(T);
    l.Add(anything);
}

现在你可以做到

BuildGeneric<object>(out l);

由于下面有关于default关键字的讨论(评论),我认为我应该包含一个链接:

http://msdn.microsoft.com/en-us/library/xwth0h0d(VS.80).aspx

答案 1 :(得分:7)

没有。

l只能 保存T类型的对象 您的代码试图破坏泛型的整个目的。

如果您将anything更改为T类型,则会有效 如果将其强制转换为T,它将进行编译,但会在运行时抛出InvalidCastException,除非它实际上是T

你想做什么?

答案 2 :(得分:3)

您需要以这种方式修改您的功能:

public static void BuildGeneric<T>(ref List<T> l)
    where T : new()
{
    l = new List<T>();
    T anything = new T();
    l.Add(anything);
}

答案 3 :(得分:1)

对我来说,这听起来像是要创建一个包含任何类型项目的列表。正确?正如已经指出的那样 - 这是不可能完成的。

对此的适当方法是为集合中所需的对象类型创建公共接口。让集合中所需的所有类都实现此接口,然后您可以拥有一个包含实现此接口的元素的列表。