[英]Can I have a Untyped Collection in 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
}
C#4.0 IEnumerable<T>
接口實際上是IEnumerable<out T>
,這意味着如果R
派生自T
,則IEnumerable<T>
可以從IEnumerable<R>
分配。
所以,你所要做的就是把你的doSomething
變成DoSomething
並接受IEnumerable<T>
參數:
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>
。
有關更具體的建議,請提供更多詳細信息。
首先,如其他地方所述, 無界通配符參數化類型與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<?>
的唯一真實用例是與傳統非泛型集合交互時。 它允許您避免編譯器的未經檢查的轉換警告。
C#沒有這個用例。 使用擦除未實現C#泛型。 .net中的泛型和非泛型集合之間沒有向后兼容性 - 它們共存於核心.net庫中。 這與Java不同,其中集合api的通用版本替換了JDK 1.5的非泛型版本。
所以我認為沒有理由在C#中想要這個構造 ,並且沒有直接的等價物以相同的方式運行。
這聽起來像IList
是你正在尋找的。 它是列表的通用接口,這意味着你必須拋出任何出來的東西並小心你放入的東西。
你可以使用
List<object>
我認為提問者想要轉換這樣的東西
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.