.net 转换旧的托管-C++;新C+项目+/CLI

.net 转换旧的托管-C++;新C+项目+/CLI,.net,visual-c++,c++-cli,clr,managed-c++,.net,Visual C++,C++ Cli,Clr,Managed C++,我有一个用旧语法编写的旧项目。它在VS2012中运行得很好,但我看到在VS2015/clr中:oldSyntax不再可用,正如我所期望的,我有很多错误。 我设法摆脱了其中一些,但现在我在以下代码行中受阻: ref class myColumnItemSorterClass : public IComparer { int IComparer::Compare(Object^ x, Object^ y) { if (x &&a

我有一个用旧语法编写的旧项目。它在VS2012中运行得很好,但我看到在VS2015/clr中:oldSyntax不再可用,正如我所期望的,我有很多错误。 我设法摆脱了其中一些,但现在我在以下代码行中受阻:

ref class myColumnItemSorterClass : public IComparer
    {
        int IComparer::Compare(Object^ x, Object^ y)
        {
            if (x && y) {
                ColumnItemType^ pSSx = dynamic_cast<ColumnItemType^>(x);
                ColumnItemType^ pSSy = dynamic_cast<ColumnItemType^>(y);

                if (pSSx->Position&&pSSx->Position->Length>0 &&
                    pSSy->Position&&pSSy->Position->Length>0) {

                    int xPos = Convert::ToInt32(pSSx->Position);
                    int yPos = Convert::ToInt32(pSSy->Position);

                    if (xPos < yPos) {
                        return -1;
                    } else if (xPos > yPos) {
                        return 1;
                    } else {
                        return 0;
                    }
                } else {
                    return 0;
                }

            } else {
                return 0;
            }
        }
    };
ref class MyColumnItemSortrClass:公共IComparer
{
int IComparer::比较(对象^x,对象^y)
{
if(x&y){
ColumnItemType ^pSSx=动态转换(x);
ColumnItemType ^pSSy=动态转换(y);
如果(pSSx->Position&&pSSx->Position->Length>0&&
pSSy->Position&&pSSy->Position->Length>0){
intxpos=Convert::ToInt32(pSSx->Position);
int yPos=Convert::ToInt32(pSSy->Position);
如果(xPosYPO){
返回1;
}否则{
返回0;
}
}否则{
返回0;
}
}否则{
返回0;
}
}
};
有两个错误:

  • 在MyColumnItemSortrClass->Class中,未能实现接口成员函数“System::Collections::IComparer::Compare”(在“C:…\NETFramework\v4.0\mscorlib.dll”中声明)

  • 在比较时->不允许使用限定名称


  • 知道如何修复它们吗?

    重写的接口方法必须是
    虚拟的
    公共的
    ,并且可以是
    密封的
    ,以防止派生类重新实现该方法

    不要使用接口名称限定方法(例如:
    IComparer::Compare
    )。编译器将此解释为定义显式重写的尝试失败(请参阅编译器错误)

    如果希望重写的方法只能通过接口句柄访问,则可以使用。重写的方法必须仍然是
    虚拟的
    ,但可以是
    私有的
    ,并且应该是
    密封的

    ref class myColumnItemSorterClass :  IComparer
    {
    private:
        virtual int CompareExplicit(Object^ x, Object^ y) sealed  = IComparer::Compare
        {
            /*...*/
            return 0;
        }
    };
    

    谢谢你的回答!
    ref class myColumnItemSorterClass :  IComparer
    {
    private:
        virtual int CompareExplicit(Object^ x, Object^ y) sealed  = IComparer::Compare
        {
            /*...*/
            return 0;
        }
    };