У меня проблемы с реализацией IEnumerable<T>
в моем собственном классе коллекции в C ++ / CLI. Вот соответствующая часть кода:
using namespace System::Collections::Generic;
ref class MyCollection : IEnumerable<MyClass^>
{
public:
MyCollection()
{
}
virtual IEnumerator<MyClass^>^ GetEnumerator()
{
return nullptr;
}
};
При компиляции это приводит к следующим ошибкам:
ошибка C2392:
«System :: Подборки :: Общий :: IEnumerator
^ MyCollection :: GetEnumerator (аннулируются) ':
ковариантные типы возвратов не
поддерживается в управляемых типах, в противном случае
«System :: Коллекция :: IEnumerator
^ Система :: Подборки :: IEnumerable :: GetEnumerator (аннулируются)»
будет переопределена ошибка C3766:
«MyCollection» должен предоставить
реализация для интерфейса
метод
«System :: Коллекция :: IEnumerator
^ Система :: Подборки :: IEnumerable :: GetEnumerator (аннулируются) '
Это имеет смысл, поскольку 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()
, компилятор пожалуется на два метода, которые отличаются только типом возвращаемого значения (что также имеет смысл).
Итак, как мне реализовать IEnumerable<T>
в классе C ++ / CLI?