2012-02-09 3 views
0

У меня есть класс, определяемый как:Десятичного^Указанного Cast Invalid вызова 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); 
    } 

Если я бряк на эту строку и вставьте this->tickValue->ToString() в быстрые часы он работает отлично!

Я заметил, что подпись моего конструктора была изменена на MyParameters(ValueType^ tickValue) ??

+0

Ваш код отлично подходит для меня. Вы уверены, что это именно тот код, который у вас есть, тем более, что в нем была синтаксическая ошибка? Какова трассировка стека исключения? Вы уверены, что передаете «decimal» в конструктор? – svick

+1

'System :: Decimal' - это тип значения, а не ссылочный тип. Измените все 'Decimal ^' на 'Decimal', если нет причин, по которым вы действительно хотите бокс здесь. – ildjarn

ответ

0

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

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

new MyParameters(42) 

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

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

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

Смежные вопросы