我正在尝试实现通用方法<u>,在我实现通用接口<t>,如果我要返回iEnumerable<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);
};