Ошибка компиляции С# с LINQ и динамическим наследованием

Рассмотрим следующий код (для этого теста он не делает ничего особого использования - он просто демонстрирует возникшую ошибку)

Dictionary<string, dynamic> d = new Dictionary<string, dynamic>()
{
    { "a", 123 },
    { "b", Guid.NewGuid() },
    { "c", "Hello World" }
};
d.Where(o => o.Key.Contains("b")).ForEach(i => Console.WriteLine(i.Value));
//retuns the Guid value, as expected.

Я хочу обернуть Dictionary<string, dynamic> с помощью наследования:

public class CustomDictionary : Dictionary<string, dynamic>
{
}

Вот пример выше, используя этот производный класс:

CustomDictionary d = new CustomDictionary()
{
    { "a", 123 },
    { "b", Guid.NewGuid() },
    { "c", "Hello World" }
};
d.Where(o => o.Key.Contains("b")).ForEach(i => Console.WriteLine(i.Value));

Это происходит...

enter image description here

enter image description here

Любые идеи о том, что вызывает проблему, или как ее решить?

Ответы

Ответ 1

Я считаю, что я сузил это с привязкой к методу расширения Linq Where.

Это работает:

   d.AsEnumerable()
    .Where(o => o.Key.Contains("b"))
    .ToList()
    .ForEach(i => Console.WriteLine(i.Value));

И это работает (вызов метода расширения статически):

Enumerable.Where(d.AsEnumerable(),o => o.Key.Contains("b"))
          .ToList()
          .ForEach(i => Console.WriteLine(i.Value));

но это не так:

   d.Where(o => o.Key.Contains("b"))
    .ToList()
    .ForEach(i => Console.WriteLine(i.Value));

Если я вызываю статический метод расширения без AsEnumerable():

Enumerable.Where(d,o => o.Key.Contains("b"))
          .ToList()
          .ForEach(i => Console.WriteLine(i.Value));

Я получаю лучшую ошибку компилятора:

Аргумент 1: невозможно преобразовать из 'UserQuery.CustomDictionary' в 'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,dynamic>>'

Поэтому по какой-то причине компилятор не может привязать унаследованный класс к методу расширения.

Также работают следующие методы:

  • явно лить d в IEnumerable<System.Collections.Generic.KeyValuePair<string,dynamic>>
  • используя object вместо dynamic