1

次の DisplayContents が IEnumerable のフォームを継承するため、ArrayList に対して機能しない (コンパイルできない) のはなぜですか?

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);
            }
        }
    }
4

6 に答える 6

7

ArrayListを実装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);
    }
}
于 2012-04-04T18:30:31.903 に答える
4

さて、ドキュメントを簡単に確認すると、 は実装されてArrayListいませんIEnumerable<T>が、代わりに が実装されていることがわかります。これは、ジェネリックの前の時代の痕跡アーティファクトであり、今日では実際の用途がほとんどないため、IEnumerable理にかなっています。ArrayList

使う理由は特にありませんArrayList。少なくとも を使用できますがList<object>、それによってどのような問題が解決されるのでしょうか? 共通のインターフェイスを実装しない/実装できず、新しい型にグループ化できないランダムな型のコレクションがどうしても必要な場合を除き、より具体的なジェネリック パラメーターを使用します。

于 2012-04-04T18:30:14.853 に答える
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>

于 2012-04-04T18:34:17.820 に答える
0

ArrayListを実装IEnumerableしますが、ジェネリックではありませんIEnumerable<T>

更新:これは機能します:

 public static void DisplayContents(IEnumerable collection)
 {
     foreach (var _item in collection)
         Console.WriteLine(_item);
 }
于 2012-04-04T18:30:04.367 に答える
-3

呼び出し回線をこれに変更すると、次のように機能します。

    DisplayContents(l3.ToArray());
于 2012-04-04T18:33:07.940 に答える