C# / IronPython Interop и тип данных "float"
Работа над проектом, который использует некоторые сценарии IronPython в качестве плагинов, которые используют функциональность, написанную на C#. В одном из моих классов C# у меня есть свойство, которое имеет тип:
Dictionary<int, float>
Я устанавливаю значение этого свойства из кода IronPython, например:
mc = MyClass()
mc.ValueDictionary = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024})
Однако, когда этот бит кода выполняется, он выдает следующее исключение:
Microsoft.Scripting.ArgumentTypeException was unhandled by user code
Message=expected Dictionary[int, Single], got Dictionary[int, float]
Чтобы сделать вещи более странными, изначально использовался код C#
Dictionary<int, double>
но я не смог найти "двойной" тип в IronPython, попробовал "плавать" по прихоти, и все работало нормально, без ошибок. Но теперь, когда он использует float на обоих концах (который он должен был использовать с самого начала), он ошибается и думает, что код C# использует тип данных Single.
Я даже проверил в браузере объектов библиотеку C# и, конечно же, она показывает, что использует тип "float", а не "Single"
1 ответ
Я действительно не вижу здесь вопроса, вы сами очень ответили на все вопросы. Я думаю, вы просто спрашиваете, потому что вы в замешательстве. Итак, давайте проясним ситуацию:
C# имеет два типа с плавающей точкой: float
(ключевое слово, которое сокращенно от System.Single
MSDN, длиной 32 бита) и double
(ключевое слово для System.Double
MSDN, длиной 64 бита).
Python на другой стороне использует float
ключевое слово / тип для хранения числа с плавающей запятой двойной точности, как указано в документации по Python:
Числа с плавающей запятой реализуются с использованием двойных в C. Все ставки на их точность отключены, если вы случайно не знаете машину, с которой работаете.
Для этого на архитектуре x86 он имеет длину 64 бита. Вот почему IronPython рассматривает питона float
как.NET System.Double
,
Тем не менее, оба эти метода будут работать:
C#:
Dictionary<int, float> single_precision_dict;
Dictionary<int, double> double_precision_dict;
IronPython:
single_precision_dict = Dictionary[int, Single]({1:0.0, 2:0.012, 3:0.024})
double_precision_dict = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024})