2010-06-09 4 views
5

Travailler sur un projet qui utilise des scripts IronPython comme plug-ins, qui utilisent la fonctionnalité codée en C#. Dans une de mes classes C#, j'ai une propriété qui est de type:C#/IronPython Interop et le type de données "float"

Dictionary<int, float> 

Je mis la valeur de cette propriété à partir du code IronPython, comme ceci:

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

Cependant, lorsque ce bit de code est exécuté, il jette l'exception suivante:

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

Pour rendre les choses plus étranges, à l'origine du code C# utilisé

Dictionary<int, double> 

mais je n'ai pas pu trouver un type "double" dans IronPython, j'ai essayé "float" sur un coup de tête et ça a bien fonctionné, sans donner d'erreur. Mais maintenant qu'il utilise float sur les deux extrémités (qu'il aurait dû utiliser depuis le début) il erreurs, et pense que le code C# utilise le type de données "Single" ?!

J'ai même vérifié dans le navigateur d'objets pour la bibliothèque C# et, bien sûr, il montre que l'utilisation d'un type « float » et non « Single »

Répondre

7

je ne vois pas vraiment une question, vous très beaucoup répondu à tout vous-même. Je suppose que vous demandez simplement parce que vous êtes confus. permet donc clarifier les choses:

C# a les deux types de virgule flottante: float (un mot-clé qui est court pour System.SingleMSDN, 32 bits long) et double (mot-clé pour System.DoubleMSDN, 64 bits long).

Python de l'autre côté utilise le mot clé/type float pour stocker un nombre double virgule flottante de précision, comme les python documentation états:

nombres à virgule flottante sont mises en œuvre en utilisant le double en C. Tous les paris sur leur la précision est éteinte, sauf si vous connaissez la machine avec laquelle vous travaillez.

Pour cela, sur une architecture x86, il a une longueur de 64 bits. C'est la raison pour laquelle IronPython traite un python float en tant que .NET System.Double.

Cela dit, ces deux méthodes sera à la fois le travail:

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

Merci, réponse parfaite. Et ouais, je suppose que j'avais déjà défini ce que les cartographies étaient, je ne savais pas pourquoi. Il semblait juste contre intuatif que float en C# ne soit pas flottant en Python. –

+0

Vous êtes les bienvenus! J'ai eu un problème similaire récemment (C#/Python Interop). C'est en effet très contre-intuitif, comme tous les langages C-like, Java et beaucoup d'autres utilisent 'float' pour les nombres de précision simple. –

Questions connexes