2010-06-09 13 views
5

Praca nad projektem, który wykorzystuje niektóre skrypty IronPython jako wtyczki, które wykorzystują funkcjonalność zakodowaną w języku C#. W jednym z moich # klas C, mam właściwość, która jest typu:C#/IronPython Interop i typ danych "float"

Dictionary<int, float> 

ustawić wartość tej nieruchomości z kodem IronPython coś takiego:

mc = MyClass() 
mc.ValueDictionary = Dictionary[int, float]({1:0.0, 2:0.012, 3:0.024}) 

Jednak, gdy ten bit od kod jest uruchamiany, to rzuca następujący wyjątek:

Microsoft.Scripting.ArgumentTypeException was unhandled by user code 
    Message=expected Dictionary[int, Single], got Dictionary[int, float] 

Żeby było dziwniej, pierwotnie kod C# użyte

Dictionary<int, double> 

ale nie mogłem znaleźć "podwójnego" typu w IronPython, wypróbowałem "float" na kaprysie i działało dobrze, nie dając żadnych błędów. Ale teraz, gdy używa on float na obu końcach (który powinien był używać od początku) to błędy i myśli, że kod C# używa "pojedynczego" typu danych ?!

Mam jeszcze sprawdzone w przeglądarce obiektu dla C# biblioteki, a na pewno wystarczy, to pokazuje, jak za pomocą „float” typu, a nie „Single”

Odpowiedz

7

I naprawdę nie patrz pytanie tutaj, to bardzo wiele odpowiedziałem na siebie. Chyba właśnie pytasz, ponieważ jesteś zdezorientowany. Tak więc zaczynamy jasne rzeczy:

C# ma dwie pływające rodzaje punkcie: float (słowo kluczowe, które jest skrótem System.SingleMSDN 32- długi) i double (kluczowe dla System.DoubleMSDN, 64 bit długi).

Python po drugiej stronie używa float kluczowym/typ do przechowywania podwójnej precyzji liczbę zmiennoprzecinkową, jak python documentation stanów:

Liczby zmiennoprzecinkowe są zaimplementowane użyciem podwójnie w C. Wszystkie zakłady na ich precyzja jest wyłączona, chyba że znasz maszynę, z którą pracujesz.

W tym przypadku na architekturze x86 ma on długość 64 bitów. Z tego powodu IronPython traktuje pytona float jako .NET System.Double.

Powiedział, że te dwie metody będą zarówno prace:

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}) 
+0

Dziękuję, doskonała odpowiedź. I tak, wydaje mi się, że już trochę ułożyłem to, co było odwzorowaniem, po prostu nie wiedziałem dlaczego. Po prostu wydawało się sprzeczne intuicyjnie, że float w C# nie byłby unormowany w Pythonie. –

+0

Nie ma za co! Ostatnio miałem podobny problem (C#/Python Interop). Jest to rzeczywiście bardzo sprzeczne z intuicją, ponieważ wszystkie języki podobne do C, Java i wiele innych używają 'float' dla liczb pojedynczych precyzji. –