Вот что говорит JLS по этому вопросу (в нетехническом обсуждении).
Следующие 19 конкретных преобразований примитивных типов называются расширяющимися примитивными преобразованиями:
int
long
,float
илиdouble
- (без учета опущенных)
Преобразование значения
int
илиlong
вfloat
или значение отlong
доdouble
может привести к потере точности , то есть результат может потерять некоторые из младших значащих битов значения. В этом случае результирующее значение с плавающей запятой будет правильно округленной версией целочисленного значения с использованием режима округления до ближайшего стандарта IEEE 754.Несмотря на то, что может произойти потеря точности, расширяющиеся преобразования среди примитивных типов никогда не приводят к исключению во время выполнения.
Вот пример расширяющегося преобразования, которое теряет точность:
class Test { public static void main(String[] args) { int big = 1234567890; float approx = big; System.out.println(big - (int)approx); } }
, которое печатает:
-46
, что указывает на то, что информация была потеряна во время преобразования из типа
int
чтобы ввестиfloat
, потому что значения типаfloat
не являются точными до девяти значащих цифр.
Я не совсем уверен, правильно ли я понял ваш вопрос, но, может быть, вам понадобится VT_DISPATCH
?
Я думаю, если вы хотите, чтобы он работал с VT_RECORD
, тогда ваша структура должна быть структурой (а не классом), а также требует атрибута [StructLayout (LayoutKind.Sequential)]
.
Правка : Может быть, первая ошибка, которую вы получили, была DISP_E_BADINDEX
? Что такое индексы
в вашем коде? Что в нем содержится? (Вы знаете, что подпись SafeArrayPutElement
требует, чтобы это был указатель, верно?)