Десятичное ^ Указанное приведение Неверный вызов ToString () - PullRequest
0 голосов
/ 09 февраля 2012

У меня есть класс, определенный как:

    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 голосов
/ 09 февраля 2012

В .Net отсутствует понятие «типизированная ссылка на тип значения». * И поскольку Decimal^ именно так, то скомпилировать его невозможно.Как вы заметили, компилятор вместо этого создает параметр ValueType^, который наиболее близок к Decimal^ в системе типов .Net.Он также добавляет некоторые метаданные, так что когда вы вызываете конструктор из C ++ / CLI, ему могут быть переданы только упакованные Decimal.

Но другие языки не понимают эти метаданные, все что они видят, это1007 *.Это означает, что вы можете вызывать конструктор, скажем, из C # следующим образом, и он отлично работает:

new MyParameters(42)

Обратите внимание, что я передал int, а не decimal.И это int сохраняется в поле tickValue (которое на самом деле также ValueType^).И только при попытке фактически использовать его значение как Decimal^, вы получаете InvalidCastException.

Самый простой способ исправить это - не использовать ссылки на типы значений.То есть вместо Decimal^ используйте просто Decimal и все должно работать нормально.

* Строго говоря, есть TypedReference, но это не предназначено для обычного использования.

...