Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有LINQ和动态继承的C#编译错误_C#_Linq_Inheritance_Compiler Errors - Fatal编程技术网

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

具有LINQ和动态继承的C#编译错误,c#,linq,inheritance,compiler-errors,C#,Linq,Inheritance,Compiler Errors,考虑下面的代码(为了这个测试,它不做任何特殊用途-它只是演示发生的错误) 这种情况发生了 关于是什么导致了这个问题,或者如何解决它,有什么想法吗?我相信我已经缩小了对LinqWhere扩展方法的绑定范围 这项工作: d.AsEnumerable() .Where(o => o.Key.Contains("b")) .ToList() .ForEach(i => Console.WriteLine(i.Value)); 这是可行的(静态调用扩展方法)

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

这种情况发生了


关于是什么导致了这个问题,或者如何解决它,有什么想法吗?

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

这项工作:

   d.AsEnumerable()
    .Where(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()

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

参数1:无法从
'UserQuery.CustomDictionary'
转换为
'System.Collections.Generic.IEnumerable'

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

以下方法也有效:

  • 显式地将
    d
    强制转换为
    IEnumerable
  • 使用
    对象
    而不是
    动态

显然,Roslyn不会因以下代码而崩溃:
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));
   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));
Enumerable.Where(d,o => o.Key.Contains("b"))
          .ToList()
          .ForEach(i => Console.WriteLine(i.Value));