visual unidades temperaturas temperatura studio programa para hacer grados farenheit fahrenheit convertir convertidor conversor conversion como codigo centígrados centigrados celsius c# generics f#

unidades - Reescribe un código genérico de C#en F#



grados centigrados a farenheit c# (3)

Estoy tratando de reescribir un código genérico como este (C #):

U Upcast<T, U>(T x) where T : U { return x; }

En F #:

let ucast<''T, ''U when ''T :> ''U> (x: ''T) = x :> ''U

Pero la resolución de restricción F # funciona de manera diferente a C # y el compilador produce un montón de errores de tipeo:

error FS0698: restricción no válida: el tipo utilizado para la restricción está sellado, lo que significa que la restricción solo se puede satisfacer como máximo con una solución

Advertencia FS0064: Este constructo hace que el código sea menos genérico que lo indicado por las anotaciones de tipo. La variable de tipo ''T'' se ha restringido para que sea del tipo '''' U ''''.

error FS0663: este parámetro de tipo se ha utilizado de una manera que lo limita a ser siempre '''' U ''''

error FS0013: la coerción estática de tipo ''U a'' U
implica un tipo indeterminado basado en información anterior a este punto del programa. Las coerciones estáticas no están permitidas en algunos tipos. Se necesitan anotaciones de tipo adicionales.

error FS0661: una o más de las variables explícitas de tipo de clase o función para este enlace no se pudieron generalizar, porque estaban restringidas a otros tipos

Por favor, explícame cómo reescribir correctamente el código C # arriba y por qué la versión F # que he escrito no se compila.


Esta es la restricción del compilador. El tipo correcto de la restricción ''a:>'' ​​b debe ser de tipo no genérico.


No puede escribir una función de seguridad de tipo para esto. Sin embargo, podría usar el operador upcast lugar de su función.