Visual studio 2012 更改了如何在C+;中使用vs2012强制转换和获取字符串枚举的行为+/CLI

Visual studio 2012 更改了如何在C+;中使用vs2012强制转换和获取字符串枚举的行为+/CLI,visual-studio-2012,enums,c++-cli,visual-studio-2005,Visual Studio 2012,Enums,C++ Cli,Visual Studio 2005,由于2010年对C++/CLI的支持非常糟糕(C++/CLI没有向导!),我的一个项目仍然是VS2005 C++/CLI。现在是迁移最后一个项目的时候了。不幸的是,它在编译时会出现错误。其中两个我不理解,因为它们以前工作得很好,请尝试在VS2012上编译此小片段: enum class EMyEnum { Unknown, NotBetter, }; Array ^lEnums=En

由于2010年对C++/CLI的支持非常糟糕(C++/CLI没有向导!),我的一个项目仍然是VS2005 C++/CLI。现在是迁移最后一个项目的时候了。不幸的是,它在编译时会出现错误。其中两个我不理解,因为它们以前工作得很好,请尝试在VS2012上编译此小片段:

        enum class EMyEnum
        {
            Unknown,
            NotBetter,
        };

        Array ^lEnums=Enum::GetValues(EMyEnum::typeid);
        Object ^test=lEnums->GetValue(0);
        EMyEnum t=(EMyEnum)test;  // VS2012 ERROR -> Cannot cast
        String ^thetext=t.ToString(); // VS2012 ERROR -> Left of ToString() needs object

不用说,在VS2005中,它不仅编译时没有错误或警告,而且工作正常。

是的,这在VS2012及以上版本中是一个问题。这是由于C++11语言标准采用了
enum类
语法造成的。C++/CLI编译器现在不再能够区分托管枚举类型和非托管枚举类型。来自对象^1的强制转换仅对托管枚举有效

解决方法虽然愚蠢但有效,您应该显式指定枚举类的可访问性。在C++11中不合法但在C++/CLI中有效的内容。修正:

    private enum class EMyEnum      // Note: added private
    {
        Unknown,
        NotBetter,
    };

或者公开使用。

你知道你很了不起吗?:-)