首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ和动态继承的C#编译错误

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

Stack Overflow用户
提问于 2014-12-17 06:08:58
回答 1查看 328关注 0票数 16

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

代码语言:javascript
复制
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>

代码语言:javascript
复制
public class CustomDictionary : Dictionary<string, dynamic>
{
}

下面是上面使用这个派生类的示例:

代码语言:javascript
复制
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));

这种情况发生了..。

有没有什么想法导致这个问题,或者如何解决它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-17 07:40:59

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

这是可行的:

代码语言:javascript
复制
   d.AsEnumerable()
    .Where(o => o.Key.Contains("b"))
    .ToList()
    .ForEach(i => Console.WriteLine(i.Value));

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

代码语言:javascript
复制
Enumerable.Where(d.AsEnumerable(),o => o.Key.Contains("b"))
          .ToList()
          .ForEach(i => Console.WriteLine(i.Value));

但这不是:

代码语言:javascript
复制
   d.Where(o => o.Key.Contains("b"))
    .ToList()
    .ForEach(i => Console.WriteLine(i.Value));

如果我调用不带AsEnumerable()的静态扩展方法

代码语言:javascript
复制
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>>
  • using object,而不是dynamic
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27514856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档