考虑下面的代码(为了这个测试的目的,它不做任何有特殊用途的事情--它只是为了演示发生的错误)
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));
这种情况发生了..。
有没有什么想法导致这个问题,或者如何解决它?
发布于 2014-12-17 07:40:59
我相信我已经缩小了与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
https://stackoverflow.com/questions/27514856
复制相似问题