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

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            List<object> list = new List<object>();
            List<Dictionary<string, object>> dict = new List<Dictionary<string, object>>();

            Dictionary<string, object> master = new Dictionary<string, object>();
            master.Add("list", list);
            master.Add("dict", dict);

            List<object> mydict = (List<object>)master["dict"]; // this is where i get exception
            Console.Write("Count: ", mydict.Count);
        }
    }
}

太字の行で例外をスローしています。この動作の理由と、この要素にアクセスするにはどうすればよいですか? ありがとう

4

4 に答える 4

5

List<object>dictキーの下にないため

var mydict = (List<Dictionary<string, object>>)master["dict"];
于 2013-08-13T09:14:57.310 に答える
3

master["dict"]は aですがList<Dictionary<string, object>>、コードはそれを a にキャストしList<object>ます。は typeList<T> で不変であるため、機能しませんT。より単純な例を使用すると、これは有効ではありません。

var list = new List<string>();
var listOfObjects = (List<object>)list;

引き出しているアイテムのタイプが何らかの形でわかっている場合は、masterそれを適切なタイプにキャストできます。

var masterDict = (List<Dictionary<string, object>>)master["dict"];

IEnumerable<object>または、そのインターフェイスはその型パラメーターで共変であるため、値をにキャストできます。

// This is not really meaningful because you can cast to non-generic IEnumerable
// just as well, but it works as a demonstration of what is possible.
var mycollection = (IEnumerable<object>)master["dict"];
于 2013-08-13T09:16:59.027 に答える
0

IEnumerableまたはメソッドが必要な場合はICollection、次のような非ジェネリック インターフェイスにキャストできます。

        ICollection mydict = (ICollection)master["dict"];
        Console.Write("Count: ", mydict.Count);
于 2013-08-13T09:23:43.083 に答える