我可以在C#中使用Untyped Collection吗?

时间:2010-08-12 00:14:47

标签: c# java collections

我正在将一些Java代码移植到C#,我遇到了这个问题:

List<?>

据我了解,这是List类型Unknown。结果我可以在其他地方指定类型(在运行时?我不确定)。

C#中的基本等价物是什么?

6 个答案:

答案 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>派生自RT可以从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(); 
}