Python NET llama al método C # que tiene un valor de retorno y un parámetro de salida

Estoy teniendo el siguiente método estático C #

public static bool TryParse (string s, out double result) 

que me gustaría llamar desde Python usando el paquete NET de Python.

 import clr from System import Double r0 = Double.IsNaN(12.3) # works r1, d1 = Double.TryParse("12.3") # fails! TypeError: No method matches given arguments. This works in IronPython. d2 = 0.0 r2, d2 = Double.TryParse("12.3", d2) # fails! TypeError: No method matches given arguments 

¿Alguna idea?

Actualizar

Encontré la siguiente respuesta, consulte https://stackoverflow.com/a/19600349/7556646 .

CPython usando PythonNet hace básicamente lo mismo. La manera más fácil de hacer parámetros es no pasarlos y aceptarlos como valores de retorno adicionales, y para que los parámetros de referencia pasen los valores de entrada como argumentos y acepten los valores de salida como valores de retorno adicionales.

Esto diría que r1, d1 = Double.TryParse("12.3") debería funcionar, pero no lo hace.

Recientemente tuve que solucionar un problema similar con el uso de Python para .NET , permítame compartir con usted lo que he descubierto.

Necesitas pasar tantos argumentos como requiera el método. Dado que el concepto de argumentos out (= pasado por referencia) no se aplica a Python, el truco es pasar algunos argumentos ficticios del tipo esperado.

La llamada al método devolverá primero los valores que se supone que debe devolver y los valores de out .

Para mi caso de uso, el método de C # al que estaba llamando no devolvió nada originalmente (método de anulación), sin embargo, la llamada de Python devolvió primero None y luego los valores de out que buscaba, que es el comportamiento esperado como se indica aquí .

Su primer bash no pudo funcionar porque pasa solo un argumento, mientras que el método espera dos, ya sea que estén out o ref .

 r1, d1 = Double.TryParse("12.3") 

Su segundo bash tampoco pudo funcionar porque el tipo de argumento ficticio no coincide con el tipo esperado por el método, en ese caso, Double .

 d2 = 0.0 r2, d2 = Double.TryParse("12.3", d) 

Esto hará el truco:

 import clr from System import Double dummy_out = Double(0.) returned_val, real_out = Double.TryParse("12.3", dummy_out) 

Puede observar que esta última línea no tiene ningún efecto en dummy_out al verificar su id antes y después de la llamada.

Por lo tanto, una versión más corta del código que necesita sería:

 returned_val, real_out = Double.TryParse("12.3", Double(0.))