visual temperaturas temperatura programa para grados farenheit fahrenheit convertir conversor conversion centígrados centigrados celsius c# .net f# type-providers

temperaturas - grados centigrados a farenheit c#



¿Se podrían incorporar proveedores de tipo F#en C#? (2)

Los nuevos y geniales proveedores de tipos de características F # 3.0 se pueden usar para superar la falta de coincidencia entre los tipos de datos o clases de F # y las estructuras de origen de datos como XML o WSDL. Sin embargo, este desajuste también es un desafío en otros lenguajes .NET como C #.

Me gustaría usar los proveedores F # 3.0 en el código C #. ¿Cómo puedo hacer esto, en todo caso? Además, si no podemos, ¿qué necesitaría una implementación de C # para poder usarlos?


Algunos aspectos de cómo funcionan los proveedores de tipos están especialmente adaptados a las necesidades de los programadores de F #, pero pueden ser menos convincentes al considerar soluciones para el acceso de datos fuertemente tipado para otros idiomas. Por ejemplo, gran parte de la programación de F # se realiza en F # Interactive, y los proveedores de tipos permiten este flujo de trabajo muy bien en comparación con los generadores de código (que requieren un mecanismo externo al idioma para generar archivos de código fuente). Debido a que los programadores de C # se utilizan para ciclos de edición, compilación y ejecución más lentos, esto puede ser menos importante en una configuración de C #.

Desde una perspectiva técnica, sospecho que la inferencia de tipos más generalizada de F # es probablemente la mayor ventaja en comparación con lenguajes como C #. Por ejemplo, si quiero ajustar alguna lógica de acceso a datos de un proveedor de tipos en otro tipo, puedo hacer algo como esto:

let moviesStartingWith prefix = query { for movie in MyDataSource.Movies do where (movie.Title.StartsWith(prefix) } |> Seq.toList

En C #, necesitaría especificar el tipo de retorno (por ejemplo, List<DataSource.ServiceTypes.Movie> ) que termina siendo una tarea, y lo que significa que incluso con IntelliSense, estoy punteando a través del conjunto de tipos proporcionados para generar La firma además de repartir en el conjunto de valores proporcionados para generar la consulta.

Esto también se aplica a áreas distintas de los proveedores de tipos, por supuesto, pero creo que con algunas de las jerarquías de tipos anidadas que son generadas naturalmente por algunos de los proveedores, esto sería especialmente doloroso en la práctica porque los nombres de los tipos se vuelven extremadamente largos.


Creo que @kvb ofrece una buena visión general de algunas de las dificultades técnicas. Estoy de acuerdo en que la inferencia de tipos sería problemática: básicamente estaría limitado a utilizar los tipos generados por el proveedor localmente, de manera similar a los tipos anónimos . Creo que C # podría venir con algo similar en Roslyn, pero dudo que se integre con tanta elegancia y suavidad como en F # (donde los proveedores de tipos son en realidad características de lenguaje y no solo herramientas ).

Para responder a sus dos preguntas específicas:

[¿Cómo puedo] usar los proveedores F # 3.0 en el código C #?

Los proveedores de tipo F # realmente solo los entiende el compilador F #, por lo que deberá usarlos desde F #. Para los proveedores de tipos generativos (SQL, Entidades, WSDL, archivos de configuración), puede hacer referencia al proveedor desde F # y usar los tipos generados de los proyectos de C #.

Para borrar proveedores de tipos, no podrá hacer esto, porque los tipos realmente no existen y solo F # puede verlos. Así que la mejor opción es escribir su código de procesamiento en F # y devolver los resultados como colecciones de registros u otros tipos que se consumen fácilmente desde C #.

¿Qué necesitaría una implementación de C # para poder usarlos?

Podría, por supuesto, simplemente decir "¡C # tendría que apoyar a los proveedores de tipos!", Pero aquí hay algunas ideas más. Los proveedores de tipos son solo ensamblados .NET y no usan ningún tipo específico de F #. La interfaz de ITypeProvider podría ser consumida por cualquier lenguaje .NET, incluido C #, por lo que si los diseñadores de C # quisieran, podrían reutilizar a todos los grandes proveedores ya creados para F #.

Entonces, envíe esta sugerencia a la voz del usuario de C # o defiéndala en otro lugar (¡o convenza al equipo de Mono para que implemente esto!) Y tal vez se agregue en C # ( vNext + 1 + ... ). Por ahora, solo obtendrás todos los beneficios en F #.