C++/CLI 编译器无法识别返回 IEnumerable^ 的泛型方法的实现<U>



我正在尝试实现通用方法&lt;u>,在我实现通用接口&lt;t>,如果我要返回iEnumerable&lt;u>。

这是一个充分说明问题的小型代码段:

using namespace System;
using namespace System::Collections::Generic;
generic <typename T> public interface class IBase
{
    generic <typename U> U GetOne(T input);
    generic <typename U> IEnumerable<U>^ GetMany(T input);
};
public ref class Derived : public IBase<String^>
{
    public:
        generic <typename U> virtual U GetOne(String^ input); // WORKS!
        generic <typename U> virtual IEnumerable<U>^ GetMany(String^ input); //FAILS!
};

我从VS2015(SP3)编译器中获得的错误是:

错误C2553'System :: Collections :: Generic :: iEnumerable&lt;u> ^派生:: getMany(System :: String ^)':覆盖虚拟函数 返回类型不同于'System :: Collections :: generic :: ienumerable&lt;u> ^ibase :: getMany(System :: String ^)'

您可以从消息中看到,它所抱怨的返回类型与其声称的期望相同。好像没有意识到返回类型中的U与通用定义中的U相同。

我在这里做错了吗?还是这是编译器的已知问题?如果是这样,是否有任何解决方法?

我在C /CLI中唯一可以使用的是将通用参数U移动到类中,而不是将其放在每个方法上:

generic <typename T, typename U> public interface class IBase
{
    virtual U GetOne(T input);
    virtual IEnumerable<U>^ GetMany(T input);
};

您的实际代码可能是不可能的(即,其他人提供IBase,您无法更改。)

随着该更改,您可以实现接口:

generic<typename U>
public ref struct Derived : public IBase<String^, U>
{
    virtual U GetOne(String^);
    virtual IEnumerable<U>^ GetMany(String^ input);
};

最新更新