【发布时间】:2011-01-09 03:57:21
【问题描述】:
我在 C++/CLI 的自定义集合类中实现 IEnumerable<T> 时遇到问题。这是代码的相关部分:
using namespace System::Collections::Generic;
ref class MyCollection : IEnumerable<MyClass^>
{
public:
MyCollection()
{
}
virtual IEnumerator<MyClass^>^ GetEnumerator()
{
return nullptr;
}
};
编译时,这会导致以下错误:
错误 C2392: 'System::Collections::Generic::IEnumerator ^MyCollection::GetEnumerator(void)': 协变返回类型不是 在托管类型中支持,否则 '系统::集合::IEnumerator ^System::Collections::IEnumerable::GetEnumerator(void)' 将被覆盖错误 C3766: “MyCollection”必须提供 接口的实现 方法 '系统::集合::IEnumerator ^System::Collections::IEnumerable::GetEnumerator(void)'
这是有道理的,因为IEnumerable<T> 派生自IEnumerable。但是,我不确定如何修复此编译错误。如果这是 C#,我会隐式实现 IEnumerable,但是我不确定如何在 C++/CLI 中执行此操作(如果可能的话),如下所示:
class MyCollection : IEnumerable<MyClass>
{
public MyCollection()
{
}
public IEnumerator<MyClass> GetEnumerator()
{
return null;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
如果我确实添加了IEnumerable::GetEnumerator() 的实现,编译器会抱怨两种仅在返回类型上有所不同的方法(这也是有道理的)。
那么,如何在 C++/CLI 类中实现IEnumerable<T>?
【问题讨论】: