我正在将一些Java代码移植到C#,并遇到了这个问题:
List<?>
据我所知,这是一个类型为Unknown
的List
。因此,我可以在其他地方(在运行时?我不确定)指定类型。
C#中的基本相当之物是什么?
我正在将一些Java代码移植到C#,并遇到了这个问题:
List<?>
据我所知,这是一个类型为Unknown
的List
。因此,我可以在其他地方(在运行时?我不确定)指定类型。
C#中的基本相当之物是什么?
我认为与Java的List<?>
最匹配的是C# 4.0的IEnumerable<out T>
。如果您有一个接受List<?>
的方法,那么您可以使用List<Object>
和List<String>
来调用它:
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
}
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
}
编辑:如果没有C# 4.0版本,您始终可以回退到不带类型的IEnumerable
或IList
。
List<object>
或者 ArrayList
。List<T>
。// 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
List<?>
的唯一真正用例是与遗留的非泛型集合交互。它允许您避免编译器的未检查转换警告。听起来你需要的是 IList
。它是一个用于列表的通用接口,这意味着你必须对输出进行强制转换,并小心地处理输入。
我认为问询者想要将类似这样的东西转换
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();
}
List<object>
List<object>
与 Java 的 List<?>
不等价,后者是逆变的实现,而 C# 4 仍不支持(只支持接口和委托)。 - Matt Greer