2

言葉で表現するのは少し難しいので、例を挙げて説明します。次のコードはコンパイルされません。

var data = new[] {
        new {Item = "abc", Values = new[] {1,2,3}},
        new {Item = "def", Values = new[] {1,2,3}}};

IReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>> target;

target = new ReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>>(
    data.ToDictionary(
            i => i.Item,
            v => new ReadOnlyDictionary<Guid, int>(
                v.Values.ToDictionary(
                    a => Guid.NewGuid(),
                    b => b))));

私が得るエラーは次のとおりです。

The best overloaded method match for
    'ReadOnlyDictionary<string,IReadOnlyDictionary<Guid,int>>
        .ReadOnlyDictionary(IDictionary<string,IReadOnlyDictionary<System.Guid,int>>)'
has some invalid arguments

しかし、内部値のインターフェイスではなくクラスを使用してターゲットを宣言すると、次のようにコンパイルされます。

IReadOnlyDictionary<string, ReadOnlyDictionary<Guid, int>> target;

target = new ReadOnlyDictionary<string, ReadOnlyDictionary<Guid, int>>(
    data.ToDictionary(
            i => i.Item,
            v => new ReadOnlyDictionary<Guid, int>(
                v.Values.ToDictionary(
                    a => Guid.NewGuid(),
                    b => b))));

内部ディクショナリのインターフェイスを使用できないのはなぜですか?

4

1 に答える 1

3

をにキャストできReadOnlyDictionaryますIReadOnlyDictionary

target = new ReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>>(
    data.ToDictionary(
            i => i.Item,
            v => (IReadOnlyDictionary<Guid, int>)new ReadOnlyDictionary<Guid, int>(
                v.Values.ToDictionary(
                    a => Guid.NewGuid(),
                    b => b))));

または、インターフェイス タイプをジェネリック引数として指定しますToDictionary

target = new ReadOnlyDictionary<string, IReadOnlyDictionary<Guid, int>>(
    data.ToDictionary<string, IReadOnlyDictionary<Guid, int>>(
            i => i.Item,
            v => new ReadOnlyDictionary<Guid, int>(
                v.Values.ToDictionary(
                    a => Guid.NewGuid(),
                    b => b))));
于 2013-08-19T17:16:57.090 に答える