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)'的最佳重载方法匹配有一些无效的参数”
答案 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)
对我来说,这听起来像是要创建一个包含任何类型项目的列表。正确?正如已经指出的那样 - 这是不可能完成的。
对此的适当方法是为集合中所需的对象类型创建公共接口。让集合中所需的所有类都实现此接口,然后您可以拥有一个包含实现此接口的元素的列表。