2010-07-09 23 views
12

¿Alguien puede explicar por qué no se compilará el segundo ejemplo a continuación?¿Por qué 'Código no es lo suficientemente genérico'?

'Test 2' da '' error FS0670: Este código no es suficientemente genérico. La variable de tipo^a no se puede generalizar porque escaparía a su alcance. ". No entiendo este mensaje de error.

// Test 1 
type test1<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> a.ToString() 

// Test 2 
type test2<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> string a 

// Test 3 
type test3<'a> = | A of 'a 
    with 
    override t.ToString() = 
     match t with 
     | A a -> string (a :> obj) 

Respuesta

5

Aquí hay otro repro:

let inline f< ^T>(x:^T) = box x 

type test4<'a> = | A of 'a 
    with 
    member t.M() = 
     match t with 
     | A a -> f a 

string es una función en línea que utiliza restricciones de tipo estático, y los diagnósticos de error para tales funciones son a veces pobres. Realmente no entiendo el mensaje de diagnóstico en sí, pero el punto es que en el sitio de la llamada no conocemos el tipo genérico 'a, lo que significa que no podemos alinear la versión correcta de la llamada al string (o f en mi repro). En, por ejemplo, En el caso en el que elevó a obj, sabemos que queremos alinear la versión obj de string, por lo que está bien.

0

Me imagino que es porque la cadena tiene una firma de (obj -> string) para el uso de la cadena en su propio está obligando a un ser de tipo obj. (F # no hace conversiones implícitas.)

+1

'string' [es de hecho' 'T -> string'] (http://msdn.microsoft.com/en-gb/library/ee340491.aspx), por lo que esto debería funcionar en teoría. Sin embargo, no tengo una mejor explicación para el error. –

+0

Oh sí, acabo de pegar una cuerda ;; en F # interactivo para obtener el tipo. ¿Presumiblemente usar cadenas está forzando a la compilación a forzar un tipo en la entrada, y está eligiendo obj como el mínimo común denominador? – Massif

Cuestiones relacionadas