2010-06-09 10 views
5

Arbeiten an einem Projekt, das einige IronPython-Skripts als Plug-Ins verwendet, die die in C# codierte Funktionalität verwenden. In einem meiner C# -Klassen, habe ich eine Eigenschaft, die vom Typ ist:C#/IronPython Interop und der Datentyp "float"

Dictionary<int, float> 

ich den Wert dieser Eigenschaft aus dem Ironpython-Code festgelegt, wie folgt aus:

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

Wenn jedoch dieses Bit der Code ausgeführt wird, ist es die folgende Ausnahme wirft:

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

Um die Dinge eigenartiger, die ursprünglich die C# -Code zu machen verwendet

Dictionary<int, double> 

aber ich konnte einen "double" -Typ in IronPython nicht finden, versuchte "float" aus einer Laune und es hat gut funktioniert, keine Fehler geben. Aber jetzt, da es float an beiden Enden verwendet (was es von Anfang an hätte verwenden sollen), ist es fehlerhaft und denkt, dass der C# -Code den Datentyp "Single" verwendet ?!

Ich habe auch im Objektbrowser für die C# Bibliothek geprüft und sicher genug, es zeigt, wie eine „float“ Art und nicht mit „Single“

Antwort

7

Ich sehe nicht wirklich eine Frage hier, Sie sehr viel hat alles selbst beantwortet. Ich schätze, du fragst nur, weil du verwirrt bist. So können klare Dinge:

C# die beiden Gleitkomma-Typen: float (ein Schlüsselwort, das für System.SingleMSDN kurz ist, 32 Bit lang) und double (Stichwort für System.DoubleMSDN, 64 Bit lang).

Python auf der anderen Seite verwendet das Schlüsselwort float/Typ eine Zahl mit doppelter Genauigkeit Gleitpunkt zu speichern, wie die Zustände python documentation:

Gleitkommazahlen werden umgesetzt in C unter Verwendung von Doppel Alle Wetten auf ihre die Präzision ist ausgeschaltet, es sei denn, Sie kennen die Maschine, mit der Sie arbeiten.

Dafür ist es auf einer x86-Architektur 64 Bit lang. Aus diesem Grund behandelt IronPython einen Python float als .NET System.Double.

Das heißt, diese beiden Methoden werden beide arbeiten:

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

Danke, perfekte Antwort. Und ja, ich denke, ich habe schon etwas über die Mappings geschrieben, ich wusste einfach nicht warum. Es schien nur widersinnig, dass Float in C# in Python nicht float sein würde. –

+0

Gern geschehen! Ich hatte in letzter Zeit ein ähnliches Problem (C#/Python Interop). Es ist in der Tat sehr entgegengesetzt intuitiv, da alle C-ähnlichen Sprachen, Java und viele andere 'float' für einfache Genauigkeitszahlen verwenden. –