在实现附加 IEnumerable<>

问题描述 投票:0回答:1
我需要在已经派生自

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 两次时感到困惑 - 案例 2)不满足要求。由于需要实现 MyInterface

,我需要包装基类并重定向所有使用的字典方法 - 我很高兴有一个更优雅的解决方案。

c# linq generics interface extension-methods
1个回答
1
投票
因为你的类实现了:

  1. IEnumerable<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>>
    
    
  2. IEnumerable<KeyValuePair<int, Dictionary<DateTime, double>>>
    
    
编译器无法推断你要调用哪个

Any

方法,它需要你帮助它做出决定,比如你想在第一个接口上调用
Any

mc.Any<KeyValuePair<int, IEnumerable<KeyValuePair<DateTime, double>>>>();
    
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.