LINQ和动态继承的C#编译错误

ser*_*0ne 16 c# linq inheritance compiler-errors

考虑以下代码(为了这个测试,它没有做任何特殊用途 - 它只是为了演示发生的错误)

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.
Run Code Online (Sandbox Code Playgroud)

我想Dictionary<string, dynamic>使用继承包装:

public class CustomDictionary : Dictionary<string, dynamic>
{
}
Run Code Online (Sandbox Code Playgroud)

以下是使用此派生类的上述检查:

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));
Run Code Online (Sandbox Code Playgroud)

有时候是这样的...

在此输入图像描述

在此输入图像描述

关于导致问题的原因或如何解决问题的任何想法?

D S*_*ley 3

我相信我已经缩小了与 Linq 扩展方法的绑定范围Where。

这有效:

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

这是可行的(静态调用扩展方法):

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

但这并没有:

   d.Where(o => o.Key.Contains("b"))
    .ToList()
    .ForEach(i => Console.WriteLine(i.Value));
Run Code Online (Sandbox Code Playgroud)

如果我调用静态扩展方法而不使用AsEnumerable():

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

我得到更好的编译器错误:

参数 1:无法从 转换'UserQuery.CustomDictionary'为'System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,dynamic>>'

因此由于某种原因,编译器无法将继承的类绑定到扩展方法。

以下方法也有效:

  • 显式转换d为IEnumerable<System.Collections.Generic.KeyValuePair<string,dynamic>>
  • 使用object而不是dynamic