十进制^指定的转换无效的调用ToString()

时间:2012-02-09 18:27:43

标签: visual-studio-2010 c++-cli decimal

我有一个定义为:

的类
    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) ??

1 个答案:

答案 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,但这并不适合正常使用。