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()由于接口,我必须没有参数,唯一不同的是返回类型,这是不允许的.
以下是我看到的选项:
IEnumerable泛型类型MyClass来实现,然后只需添加不同参数而不仅仅返回类型(例如Add)的额外方法,而无需实现额外的通用接口.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()调用中选择要返回的那个.