将旧的托管 C++ 项目转换为新的 C++/CLI

converting old Managed-C++ Project to new C++/CLI

我有一个用 oldSyntax 编写的旧项目。它在 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;
            }
        }
    };

有 2 个错误:

  1. at myColumnItemSorterClass -> Class 未能实现接口成员函数 "System::Collections::IComparer::Compare"(在“C:...\NETFramework\v4 中声明)。 0\mscorlib.dll)

  2. 在比较 -> 不允许使用限定名称

知道如何修复它们吗?

覆盖的接口方法必须virtualpublic,并且可以sealed 以防止派生 class 重新实现该方法。

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

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

如果您希望重写的方法只能通过接口句柄访问,可以使用explicit overriding。覆盖的方法必须仍然是virtual,但是可以private并且应该[=32] =] 是 sealed.

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