C # / IronPython Interop и тип данных "float" - PullRequest
5 голосов
/ 09 июня 2010

Работа над проектом, в котором в качестве плагинов используются некоторые сценарии 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>

, но я не смог найти "double "type в IronPython, пробовал" плавать "по прихоти, и все работало нормально, без ошибок.Но теперь, когда он использует float на обоих концах (который он должен был использовать с самого начала), он ошибается и думает, что код C # использует тип данных «Single»?!

Я даже проверилв браузере объектов для библиотеки C #, и, конечно же, он показывает, что использует тип «float», а не «Single»

1 Ответ

7 голосов
/ 09 июня 2010

Я действительно не вижу здесь вопроса, вы сами очень ответили на все вопросы.Я думаю, вы просто спрашиваете, потому что вы в замешательстве.Итак, давайте проясним ситуацию:

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})
...