是否可以在 VC++/CLI 中覆盖 IEnumerable?
Is it possible to override IEnumerable in VC++/CLI?
我有一个 returns 和 IEnumerable
的接口,我想在 VC++/CLI 中实现它,因为数据来自第三方非托管 DLL。
到目前为止我有:
public ref class MyEnumerable : IEnumerable<SomeType^> {
public:
virtual IEnumerator<SomeType^>^ GetEnumerator();
}
但是编译器抱怨 C2393:"Covariant returns types are not supported in managed types"。
这是否意味着我无法在 C++ 中实现 IEnumerable
s,或者是否有解决方法?
哎呀,这是一个非常笨拙的错误消息。 really 抱怨的是缺少非泛型 System::Collections::IEnumerable::GetEnumerator() 方法的实现。您必须实现它,因为通用 IEnumerable<> 接口继承了非通用接口。在 .NET 2.0 中首次添加泛型时有意义的东西,今天却不那么有意义了。我们有点受困于 .NET 1.x 遗留问题。
当你激活你的秘密解码器环时很容易做到,让它看起来像这样:
public ref class MyEnumerable : IEnumerable<SomeType^> {
public:
virtual IEnumerator<SomeType^>^ GetEnumerator();
private:
virtual System::Collections::IEnumerator^ GetEnumerator1x()
= System::Collections::IEnumerable::GetEnumerator {
return GetEnumerator();
}
};
我有一个 returns 和 IEnumerable
的接口,我想在 VC++/CLI 中实现它,因为数据来自第三方非托管 DLL。
到目前为止我有:
public ref class MyEnumerable : IEnumerable<SomeType^> {
public:
virtual IEnumerator<SomeType^>^ GetEnumerator();
}
但是编译器抱怨 C2393:"Covariant returns types are not supported in managed types"。
这是否意味着我无法在 C++ 中实现 IEnumerable
s,或者是否有解决方法?
哎呀,这是一个非常笨拙的错误消息。 really 抱怨的是缺少非泛型 System::Collections::IEnumerable::GetEnumerator() 方法的实现。您必须实现它,因为通用 IEnumerable<> 接口继承了非通用接口。在 .NET 2.0 中首次添加泛型时有意义的东西,今天却不那么有意义了。我们有点受困于 .NET 1.x 遗留问题。
当你激活你的秘密解码器环时很容易做到,让它看起来像这样:
public ref class MyEnumerable : IEnumerable<SomeType^> {
public:
virtual IEnumerator<SomeType^>^ GetEnumerator();
private:
virtual System::Collections::IEnumerator^ GetEnumerator1x()
= System::Collections::IEnumerable::GetEnumerator {
return GetEnumerator();
}
};