2012-02-09 14 views
0

私はとして定義されたクラスがあります。私はその行にブレークポイントを設定して、それが正常に動作クイックウォッチにthis->tickValue->ToString()を貼り付ける場合はToStringメソッドを呼び出す小数点^指定されたキャストが無効()

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); 
    } 

を!

コンストラクタの署名がMyParameters(ValueType^ tickValue)に変更されましたか?

+0

コードは正常に動作します。これはあなたが持っているコードとまったく同じですか?確かに、私はそれに構文エラーがあったからです。例外のスタックトレースは何ですか? 'decimal'をコンストラクタに渡していますか? – svick

+1

'System :: Decimal'は値型であり、参照型ではありません。あなたが実際にここにボクシングしたい理由がない限り、すべてのDecimal ^をDecimalに変更してください。 – ildjarn

答えて

0

.NETの「型付き型参照型」の概念はありません。Decimal^はまさにそれですから、正しくコンパイルすることはできません。あなたが気づいたように、コンパイラが行うのは、ValueType^というパラメータを、.Net型システムのDecimal^に最も近いものにすることです。また、C++/CLIからコンストラクタを呼び出すと、ボックス化されたDecimalしか渡されないように、いくつかのメタデータが追加されます。

しかし、他の言語ではそのメタデータは理解できません。表示されるのはValueTypeです。それはあなたがこのようなC#の、たとえば、からのコンストラクタを呼び出すことができますし、それが正常に動作することを意味します。私はint、ないdecimalに渡さ

new MyParameters(42) 

注意してください。このinttickValueフィールドに保存されます(実際にはValueType^)。実際にその値をDecimal^として使用しようとする場合にのみ、InvalidCastExceptionとなります。

これを修正する最も簡単な方法は、値型への参照を使用することではありません。つまり、Decimal^の代わりにDecimalを使用すれば、すべて正常に動作するはずです。

*厳密に言えば、TypedReferenceですが、これは通常の使用には意味がありません。

関連する問題