2012-04-04 41 views
1

爲什麼以下DisplayContents不是一個ArrayList工作(不會編譯),因爲它繼承形成了IEnumerable)ArrayList和IEnumerable的查詢

public class Program 
    { 
     static void Main(string[] args) 
     { 
      List<int> l = new List<int>(){1,2,3}; 
      DisplayContents(l); 

      string[] l2 = new string[] {"ss", "ee"}; 
      DisplayContents(l2); 

      ArrayList l3 = new ArrayList() { "ss", "ee" }; 
      DisplayContents < ArrayList>(l3); 

      Console.ReadLine(); 
     } 

     public static void DisplayContents<T>(IEnumerable<T> collection) 
     { 
      foreach (var _item in collection) 
      { 
       Console.WriteLine(_item); 
      } 
     } 
    } 
+0

什麼樣的錯誤你好嗎? – yoozer8 2012-04-04 18:28:10

+0

對不起錯誤是「參數1:不能從‘System.Collections.ArrayList’到‘System.Collections.Generic.IEnumerable ’轉換」 – Noel 2012-04-04 18:31:17

回答

7

ArrayList implements IEnumerable,但不是通用的IEnumerable<T>。這是可以預料的,因爲ArrayList既不通用也不受任何特定類型的約束。

您需要將DisplayContents方法的參數類型從IEnumerable<T>更改爲IEnumerable並刪除其類型參數。您收集的物品傳遞給Console.WriteLine,可以接受任何object

public static void DisplayContents(IEnumerable collection) 
{ 
    foreach (var _item in collection) 
    { 
     Console.WriteLine(_item); 
    } 
} 
+3

或者更好的是,由於沒有必要不使用'ArrayList'可言。如果您真的需要,請使用'列表',並且答案可能是「否」。 – 2012-04-04 18:31:23

+0

它是如何工作的數組呢?即,它適用於字符串[] – Noel 2012-04-04 18:33:08

+0

@Noel:陣列實現'IEnumerable的'爲他們的特定的類型。 'ArrayList'是一個過時的類型,當泛型被引入時,沒有理由爲它添加另一個接口。 – 2012-04-04 18:34:08

0

ArrayList實現IEnumerable,但不是通用IEnumerable<T>

UPDATE: 這將工作:

public static void DisplayContents(IEnumerable collection) 
{ 
    foreach (var _item in collection) 
     Console.WriteLine(_item); 
} 
4

那麼,快速檢查the docs告訴我ArrayList沒有實現IEnumerable<T>,而是實現了IEnumerable,這是有道理的ArrayList是從天殘留神器仿製藥之前,有幾個真正的今天使用。

實在沒有理由使用ArrayList可言。您至少可以使用List<object>,但是解決了什麼問題?除非你絕對需要有一個隨機類型集合,它們不能/不能實現一個通用接口,並且不能被分組到一個新類型中,那麼使用一個更具體的通用參數。

+1

換句話說,不要使用ArrayList。使用清單 2012-04-04 18:33:41

+0

不,認真。如果您今天正在使用ArrayList編寫代碼,我會讓您感到滿意。 – 2012-04-04 18:34:09

+0

@MichaelPaulukonis:是的,請做。我在論壇上看到的太多了。 – 2012-04-04 18:34:57

-3

如果更改主叫線路到這一點,它的工作原理:

DisplayContents(l3.ToArray()); 
+0

它可以工作,因爲數組實現IEnumerable ,但這並不能幫助OP理解任何內容。 – 2012-04-04 18:35:26

0
ArrayList l3 = new ArrayList() { "ss", "ee" };    
DisplayContents<ArrayList>(l3); 

看看你的代碼。您傳遞的是字符串列表DisplayContents(),但您要告訴它期望列表ArrayLists。

您可能打算撥打DisplayContents<string>(l3),但正如其他人已經提到的那樣,這將不起作用,因爲ArrayList不實現通用IEnumerable<T>,它只實現IEnumerable

你可以改爲調用

DisplayContents<string>((string[])l3.ToArray(typeof(string))); 

這工作,因爲string[]實現IEnumerable<string>

0

擴展方法如何?

/// <summary> 
/// Projects any <see cref="IEnumerable"/>, e.g. an <see cref="ArrayList"/> 
/// to an generic <see cref="IEnumerable{T}"/>. 
/// </summary> 
/// <typeparam name="T">The type to project to.</typeparam> 
/// <param name="source">The source sequence.</param> 
/// <param name="map">The mapping function.</param> 
/// <returns>A sequence of <typeparamref name="T"/>.</returns> 
public static IEnumerable<T> Select<T>(this IEnumerable source, Func<object, T> map) 
{ 
    foreach(var item in source) 
    { 
     yield return map(item); 
    } 
}