IEnumerable<KeyValuePair<int,IEnumerable<KeyValuePair<DateTime,double>>>>
的类上实现
Dictionary<int,Dictionary<DateTime,double>>
不幸的是,当我尝试访问像
Any()
这样的 LINQ 扩展并返回 CS1061:时,编译器会感到困惑
public interface MyInterface
: IEnumerable<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>>
{
}
public class MyClass : Dictionary<int,Dictionary<DateTime, double>>, MyInterface
{
//setting GetEnumerator() to public yields an CS0106
IEnumerator<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>>
IEnumerable<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>>.GetEnumerator()
{
yield break;
}
static public void Foo(IEnumerable<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>> data)
{
//processing data...
}
static void Demo()
{
var mc = new MyClass();
//stops working if MyInterface is implemented:
mc.Any();//CS1061
Foo(mc);
}
//Workaround for specific LINQ-extensions:
//public bool Any() => this.Any();
}
最终,该类在方法中用作参数,例如
Foo(...)
需要比
Dictionary
更通用。我们如何在
MyClass
上使用 LINQ,同时实现
MyInterface
? (提供另一种将
MyClass
传递到
Foo
的方法也会有所帮助,但这不是问题的答案)。一个非常相似的问题的答案(
LINQ 在实现 IEnumerable 两次时感到困惑MyInterface
,我需要包装基类并重定向所有使用的字典方法 - 我很高兴有一个更优雅的解决方案。
IEnumerable<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>>
IEnumerable<KeyValuePair<int, Dictionary<DateTime, double>>>
Any
方法,它需要你帮助它做出决定,比如你想在第一个接口上调用
Any
:
mc.Any<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>>();