2012-02-19 20 views
5

Por lo tanto, si desea escribir una línea en la consola en C#, se hacen las siguientes:funciones anónimas y métodos sobrecargados en F #

System.Console.WriteLine "foo" 

Originalmente pensé que el siguiente era más o menos idénticos, sólo más detallado, pero en realidad se da el error "Una sobrecarga única para el método 'WriteLine' no pudo ser determinada sobre la base de información de tipo antes de este punto del programa":

(fun line -> System.Console.WriteLine line) "foo" 

parece que la segunda versión es confundido por la presencia de métodos WriteLine sobrecargados que toman una cadena así como otros argumentos. ¿Mi suposición está en la línea correcta?

Respuesta

12

No exactamente. En el primer caso, la llamada de función sabe que se está aplicando a un literal de cadena, por lo que puede hacer una resolución de sobrecarga para encontrar la sobrecarga de cadena.

En el segundo caso, line es una variable de tipo sin resolver a la inferencia de tipos en el punto de la llamada al método sobrecargado WriteLine, por lo que no se sabe lo que sobrecargue a recoger, y no ha visto el argumento de cadena sin embargo, como tipo de inferencia es de izquierda a derecha.

cambiarlo a

"foo" |> (fun line -> System.Console.WriteLine line) 

y funcionará, ya que la variable inferencia tipo para line conseguirá unificado con string de "foo" que entra, antes que necesita para determinar la llamada WriteLine.

Por lo tanto, la clave es la inferencia de tipo de izquierda a derecha; en ausencia de una solución para una variable de tipo, aún no es posible seleccionar una sobrecarga.

Cuestiones relacionadas