我正在使用泛型将Java代码转换为C#,并且遇到了类似容器的问题:
public static class MyExtensions
{
public static void add(this List<object> list, object obj)
{
list.Add(obj);
}
public static void add(this List<string> list, string s)
{
list.Add(s);
}
}
似乎泛型在比较参数时丢失了,两种方法相互冲突。我想知道仿制药是否可以这种方式使用。是否可以使用单个支持所有列表操作:
public static void add(this List<object> list, object obj)
{
list.Add(obj);
}
例如?
摘要所有回复都有相同的解决方案。 列表可以抽象为ICollection。总的来说,生产代码可能不是一个好主意。
答案 0 :(得分:10)
怎么样:
public static void add<T>(this IList<T> list, T value)
{
list.Add(value);
}
(实际上,它可能是ICollection<T>
,因为这(IList<T>
}定义了Add(T)
)
答案 1 :(得分:5)
你试过了吗?
public static void add<T>(this List<T> list, T obj)
{
list.Add(obj);
}
我不确定你是否想把它限制在一个班级,但那应该是你所描述的。
答案 2 :(得分:5)
你的意思是:
public static void add<T>(this List<T> list, T obj)
{
list.Add(obj);
}
答案 3 :(得分:5)
我认为Marc Gravell answered this best,但我会补充:
根本不要这样做。没有优势:
myList.add(obj);
VS
myList.Add(obj);
这里唯一的“优势”是大多数开发人员认为你的C#看起来不对。如果您要从Java移植到C#,那么值得花些额外的时间让您的方法看起来像原生.NET方法一样工作。
答案 4 :(得分:0)
最通用的方式:
public static void add<T>(this ICollection<T> list, T obj) // use ICollection<T>
{
list.Add(value);
}
答案 5 :(得分:0)
list.Add(obj);