2010-06-09 8 views
5

Trabajando en un proyecto que utiliza algunos scripts de IronPython como plug-ins, que utilizan la funcionalidad codificada en C#. En una de mis clases de C#, tengo una propiedad que es de tipo:C#/IronPython Interop y el tipo de datos "flotante"

Dictionary<int, float> 

fijo el valor de dicha propiedad de la código de IronPython, así:

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

Sin embargo, cuando este bit de código se ejecuta, se lanza la siguiente excepción:

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

Para hacer las cosas más extrañas, originalmente el código C# utiliza

Dictionary<int, double> 

pero no pude encontrar un tipo "doble" en IronPython, intenté "flotar" por un capricho y funcionó bien, sin dar ningún error. Pero ahora que está usando float en ambos extremos (que debería haber estado usando desde el principio) comete un error, y piensa que el código C# está usando el tipo de datos "Single"?

Incluso he comprobado en el explorador de objetos para la biblioteca de C# y, efectivamente, se muestra como el uso de un tipo de "flotar" y no "individual"

Respuesta

7

Realmente no veo una pregunta aquí, muy mucho respondiste todo tú mismo. Supongo que solo preguntas porque estás confundido. Así que vamos a aclarar las cosas:

C# tiene los dos tipos de coma flotante: float (una palabra clave que es la abreviatura de System.SingleMSDN, 32 bits de largo) y double (palabra clave para System.DoubleMSDN, 64 bits de longitud).

Python en el otro lado utiliza la palabra clave float/tipo para almacenar un doble precisión el número de coma flotante, como los estados python documentation:

números de coma flotante se implementan utilizando doble en C. Todas las apuestas en su la precisión está desactivada a menos que conozca la máquina con la que está trabajando.

Para eso, en una arquitectura x86, es de 64 bits de largo. Esta es la razón por la que IronPython trata una python float como .NET System.Double.

Dicho esto, estos dos métodos, tanto el trabajo:

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

Gracias, respuesta perfecta. Y sí, creo que de alguna manera ya dijiste cuáles eran las asignaciones, simplemente no sabía por qué. Simplemente parecía intuitivo que la flotación en C# no flotaría en Python. –

+0

¡De nada! Tuve un problema similar últimamente (C#/Python Interop). De hecho, es muy contrario a la intuición, ya que todos los lenguajes tipo C, Java y muchos más usan 'float' para números de precisión simples. –