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})
Другие вопросы по тегам