簡體   English   中英

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

[英]Can I have a Untyped Collection in C#

我正在將一些Java代碼移植到C#,我跑過這個:

List<?>

據我了解,這是一個類型UnknownList 結果我可以在其他地方指定類型(在運行時?我不確定)。

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不可用,您可以隨時回退到無類型IEnumerableIList

如果需要可以包含任何內容的列表,可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM