0
只需在Visual Studio for C++中创建CLR控制台应用程序,并复制此代码:在枚举类型的泛型类中,C++/CLI .ToString()编译失败:错误C2228:'.ToString'的左侧必须具有类/结构/联合
#include "stdafx.h"
using namespace System;
generic <typename TEnumMgd>
where TEnumMgd : value class, System::ValueType, System::IConvertible
public ref class EnumerationGenericClass
{
public:
EnumerationGenericClass(TEnumMgd value)
{
String^ text = value.ToString(); // Cannot compile
}
};
public enum class Test{ Foo, Bar };
int main(array<System::String ^> ^args)
{
auto obj = gcnew EnumerationGenericClass<Test>(Test::Foo);
return 0;
}
这种失败“错误C2228:左‘的ToString’必须有类/结构/联合”,但为什么以及如何加以解决?最好没有任何拳击。
更新:更改格式以区分问题和答案。
value-> ToString()是正确的语法,您想要调用System :: Object(一个引用类型)实现的方法。您可以根据需要在MSIL中获取Opcodes.Constrained而不是Opcodes.Box。看看ildasm.exe –
我猜这是因为这是在C++中唯一通用的方法。在C#中这不是问题,因为访问器总是“。”。在C++中,处理器是“。”或“ - >”取决于它的值或参考类型。对于通用类型可以是两个,所以我猜他们必须选择,因此选择“ - >”作为默认值。 – nietras
@HansPassant我不想在对象上调用ToString(),但是值类型等效,但这是IL中发生的情况,因此很好。感谢您的回复。 – nietras