В .Net отсутствует понятие «типизированная ссылка на тип значения». * И поскольку Decimal^
именно так, то скомпилировать его невозможно.Как вы заметили, компилятор вместо этого создает параметр ValueType^
, который наиболее близок к Decimal^
в системе типов .Net.Он также добавляет некоторые метаданные, так что когда вы вызываете конструктор из C ++ / CLI, ему могут быть переданы только упакованные Decimal
.
Но другие языки не понимают эти метаданные, все что они видят, это1007 *.Это означает, что вы можете вызывать конструктор, скажем, из C # следующим образом, и он отлично работает:
new MyParameters(42)
Обратите внимание, что я передал int
, а не decimal
.И это int
сохраняется в поле tickValue
(которое на самом деле также ValueType^
).И только при попытке фактически использовать его значение как Decimal^
, вы получаете InvalidCastException
.
Самый простой способ исправить это - не использовать ссылки на типы значений.То есть вместо Decimal^
используйте просто Decimal
и все должно работать нормально.
* Строго говоря, есть TypedReference
, но это не предназначено для обычного использования.