C#实现两个不同的通用接口

Sar*_*els 2 c# generics interface

我不确定我想要做什么甚至是一个好主意,但无论如何这里是问题:MyClass我想要实现两种不同类型的泛型IEnumerable类,例如

public class MyClass : IEnumerable<KeyValuePair<string, string>>,
                       IEnumerable<KeyValuePair<MyEnum, string>>
Run Code Online (Sandbox Code Playgroud)

现在,这样做的问题是当我尝试从接口定义必要的方法时,编译器抱怨"Type'MyClass'已经定义了一个名为'GetEnumerator'且具有相同参数类型的成员".这是因为我有这两种方法:

public IEnumerator<KeyValuePair<MyEnum, string>> GetEnumerator() { ... }
public IEnumerator<KeyValuePair<string, string>> GetEnumerator() { ... }
Run Code Online (Sandbox Code Playgroud)

GetEnumerator()由于接口,我必须没有参数,唯一不同的是返回类型,这是不允许的.

以下是我看到的选项:

  1. 我正在考虑使用一个"主" IEnumerable泛型类型MyClass来实现,然后只需添加不同参数而不仅仅返回类型(例如Add)的额外方法,而无需实现额外的通用接口.
  2. 我可以创建一个通用基类MyClass,调用它MyBaseClass<T>,它会实现IEnumerable<KeyValuePair<T, string>>.然后,我会有不同的版本MyClass,例如MyClass<string>MyClass<MyEnum>.

这似乎更合适,或者我错过了一些更好的解决方案?

scw*_*ner 14

您可以使用显式接口声明,以便为您实现的两个接口中的每个接口获取不同的实现.例如:

public class MyClass : IEnumerable<KeyValuePair<string, string>>,
                   IEnumerable<KeyValuePair<MyEnum, string>>
{
    IEnumerator<KeyValuePair<MyEnum, string>> IEnumerable<KeyValuePair<MyEnum, string>>.GetEnumerator()
    {
        // return your enumerator here
    }

    IEnumerator<KeyValuePair<string, string>> IEnumerable<KeyValuePair<string, string>>.GetEnumerator()
    {
        // return your enumerator here
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        var me = this as IEnumerable<KeyValuePair<string, string>>;
        return me.GetEnumerator();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,因为IEnumerable <>派生自IEnumerable,所以你必须从IEnumerable.GetEnumerator()调用中选择要返回的那个.