2

次のように定義されているユーティリティメソッドがあります

public static Dictionary<T, int> CountOccurences<T>(IEnumerable<T> items) { ... }

残念ながらArrayListの代わりに s を使用するレガシーコードがありList<T>ます。ArrayListここで、上記のメソッドを使用するためにキャストする必要があり、次の両方が機能するはずです

var v = CountOccurences<String>(arrayList.Cast<String>().ToArray());

また

var v = CountOccurences<String>(arrayList.OfType<String>().ToArray());

VS2012 では、.NET 4.5 でこれらのいずれも機能しません。

'System.Collections.ArrayList' には 'OfType' の定義が含まれておらず、タイプ 'System.Collections.ArrayList' の最初の引数を受け入れる拡張メソッド 'OfType' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか? ?)

ただし、LINQpad でこれをテストしたところ、どちらも機能します。をキャストできないのはなぜArrayListですか?

御時間ありがとうございます。

4

3 に答える 3

3

「うまくいかない」とは、InvalidCastException. したがって、 内のすべてのオブジェクトArrayListが文字列であるとは限りません。を受け取る新しい非ジェネリック オーバーロードを作成することで、この問題を回避できCountOccurencesますArrayList

(メソッドの機能を仮定)

public static Dictionary<string, int> CountOccurences(ArrayList items) 
{
    var dict = new Dictionary<string, int>();
    foreach(object t in items)
    {
        string key = "";
        if(t != null)
            key = t.ToString();
        int count;
        dict.TryGetValue(key, out count);
        dict[key] = count++;
    }
    return dict;
}
于 2013-05-31T09:22:28.750 に答える
1

私の場合、エラーは発生しません:

ところで、あなたの使い方OfType<T>は間違っています。メソッドなので追記()

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _16853758
{
    class Program
    {
        static void Main(string[] args)
        {
            ArrayList arrayList = new ArrayList();

            var a = CountOccurences<String>(arrayList.Cast<String>().ToArray());
            var v = CountOccurences<String>(arrayList.OfType<String>().ToArray());
        }

        public static Dictionary<T, int> CountOccurences<T>(IEnumerable<T> items) { return new Dictionary<T, int>(); }
    }
}
于 2013-05-31T09:20:20.823 に答える