我正在将一些Java代码移植到C#,我遇到了这个问题:
List<?>
据我了解,这是List
类型Unknown
。结果我可以在其他地方指定类型(在运行时?我不确定)。
C#中的基本等价物是什么?
答案 0 :(得分:6)
我认为与Java的List<?>
的最佳匹配是C#4.0 IEnumerable<out T>
如果您的方法需要List<?>
,则可以使用List<Object>
和{{ 1}}像这样:
List<String>
C#4.0 List<Object> objList = new List<Object>();
List<String> strList = new List<String>();
doSomething(objList); //OK
doSomething(strList); //OK
public void doSomething(List<?> theList) {
///Iterate through list
}
界面实际上是IEnumerable<T>
,这意味着,如果IEnumerable<out T>
派生自R
,T
可以从IEnumerable<T>
分配{1}}。
因此,您只需将IEnumerable<R>
变为doSomething
并接受DoSomething
参数:
IEnumerable<T>
编辑:如果C#4.0不可用,您可以随时回退到无类型List<Object> objList = new List<Object>();
List<String> strList = new List<String>();
DoSomething(objList); //OK
DoSomething(strList); //OK
public void DoSomething<T>(IEnumerable<T> theList) {
///Iterate through list
}
或IEnumerable
。
答案 1 :(得分:5)
如果您想要一个可以容纳任何内容的列表,您可以使用List<object>
或ArrayList
。
如果您想要一个包含未知类型的强类型列表,您应该创建一个通用类或方法并使用List<T>
。
有关更具体的建议,请提供更多详细信息。
答案 2 :(得分:3)
首先,如其他地方所述,无界通配符参数化类型与Object 不同。泛型不是协变的。因此,在OP的Java示例中,List<?>
与List<Object>
不同。例如,
// Unbounded wildcard type is not the same as Object...
List<?> unboundedList = new ArrayList<Object>();
List<Object> objectList = new ArrayList<Object>();
unboundedList = objectList; // no problems
objectList = unboundedList; // whoops! compile time error
Java中List<?>
的唯一真实用例是与传统的非泛型集合进行交互时。它允许您避免编译器发出unchecked conversion警告。
C#没有这个用例。使用擦除未实现C#泛型。 .net中的泛型和非泛型集合之间没有向后兼容性 - 它们共存于核心.net库中。这与Java不同,其中集合api的通用版本替换了JDK 1.5的非泛型版本。
所以我认为没有理由在C#中想要这个构造,并且没有直接的等价物以相同的方式运行。
答案 3 :(得分:1)
听起来IList
正是您所寻找的。它是列表的通用接口,这意味着你必须抛出任何出来的东西并小心你放入的东西。
答案 4 :(得分:0)
你可以使用
List<object>
答案 5 :(得分:0)
我认为提问者想要转换像这样的东西
int size2(List<?> list)
{
return 2*list.size();
}
List<Foo> list = ...
size2(list);
进入C#等价物。
以下代码无效,因为它只接受List<Object>
,而不是List<Foo>
int size2(List<Object> list)
{
return 2*list.size();
}