我有一个定义为:
的类 public ref class MyParameters
{
private:
property Decimal^ tickValue;
public:
MyParameters(Decimal^ tickValue){
this->tickValue = tickValue;
}
std::string GetTickValue();
};
std::string MyParameters::GetTickValue()
{
String^ test = this->tickValue->ToString(); <--Invalid Cast here
return marshal_as<std::string>(test);
}
如果我在该行上断点并将this->tickValue->ToString()
粘贴到快速监视中,它可以正常工作!
我注意到我的构造函数签名已更改为MyParameters(ValueType^ tickValue)
??
答案 0 :(得分:0)
.Net中没有“对值类型的类型引用”的概念。*由于Decimal^
正是如此,因此无法正确编译。正如您所注意到的,编译器所做的是改为创建参数ValueType^
,这是.Net类型系统中最接近Decimal^
的参数。它还添加了一些元数据,因此当您从C ++ / CLI调用构造函数时,只能将框Decimal
传递给它。
但其他语言并不了解元数据,他们只看到ValueType
。这意味着您可以像这样从C#调用构造函数,它可以正常工作:
new MyParameters(42)
请注意,我传递的是int
,而不是decimal
。此int
保存在tickValue
字段(实际上也是ValueType^
)中。只有在尝试将其值实际用作Decimal^
时,才会获得InvalidCastException
。
解决此问题的最简单方法是不使用对值类型的引用。也就是说,而不是Decimal^
,只使用Decimal
,一切都应该正常。
*严格来说,有TypedReference
,但这并不适合正常使用。