gpt4 book ai didi

.net - 在 C++/CLI 中实现 IEnumerable

转载 作者:行者123 更新时间:2023-12-03 21:17:24 24 4
gpt4 key购买 nike

我在实现 IEnumerable<T> 时遇到问题在我的 C++/CLI 自定义集合类中。这是代码的相关部分:

using namespace System::Collections::Generic;

ref class MyCollection : IEnumerable<MyClass^>
{
public:
MyCollection()
{
}

virtual IEnumerator<MyClass^>^ GetEnumerator()
{
return nullptr;
}
};

编译时,这会导致以下错误:

error C2392: 'System::Collections::Generic::IEnumerator ^MyCollection::GetEnumerator(void)': covariant returns types are not supported in managed types, otherwise 'System::Collections::IEnumerator ^System::Collections::IEnumerable::GetEnumerator(void)' would be overridden error C3766: 'MyCollection' must provide an implementation for the interface method 'System::Collections::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() 的实现,编译器提示两种方法仅在返回类型上有所不同(这也是有道理的)。

那么,我该如何实现 IEnumerable<T>在 C++/CLI 类中?

最佳答案

您必须提供 the non-generic GetEnumerator() method 的显式实现并包含非通用命名空间:

using namespace System::Collections;

....

virtual IEnumerator^ EnumerableGetEnumerator() = IEnumerable::GetEnumerator
{
return GetEnumerator<MyClass^>();
}

更新:正如评论中提到的,GetEnumerator 的显式版本必须命名不同以避免名称冲突,因此我将其命名为 EnumerableGetEnumerator。

同样,在 C# 中,您必须这样做:
using System.Collections.Generic;

public class MyCollection : IEnumerable<MyClass>
{
public MyCollection()
{
}

public IEnumerator<MyClass> GetEnumerator()
{
return null;
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator<MyClass>();
}
}

关于.net - 在 C++/CLI 中实现 IEnumerable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2133536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com