2010-12-30 14 views
7

Estoy intentando volver a escribir código genérico como esta (C#):Vuelva a escribir algo de código C# genéricos en F #

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 F # restricción resolución funciona diferente a C# y compilador genera un montón de errores de escritura: FS0698

de error: restricción no válida: la tipo utilizado para la restricción se sellado, lo que significa la restricción sólo podían ser satisfechas por a lo sumo un solución

FS0064 advertencia: Esta construcción hace que código a ser menos genérico que indica por las anotaciones de tipo . El tipo variable 'T se ha limitado a tipo' 'U'.

FS0663 error: Este parámetro tipo ha ha utilizado de una manera que restringe que estar siempre 'FS0013

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

error: Uno o más del tipo clase o función explícita variables para esta unión no podría generalizarse, porque eran constreñidos a otros tipos

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

Respuesta

3

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

6

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

Cuestiones relacionadas