2012-02-19 5 views
5

따라서는, 다음을 수행익명 함수와 F 번호에 오버로드 된 메서드

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

그것은 두 번째 버전의 존재에 의해 혼란 보인다 : 자세한하지만, 실제로는 "이 프로그램 지점 이전에 입력 한 정보에 기초하여 결정 할 수없는 방법 '를 WriteLine'의 고유 과부하"오류를 제공합니다 WriteLine 메서드는 다른 인수뿐만 아니라 문자열을 사용합니다. 내 가정은 바른 선상에 있니?

답변

12

정확하게는 아닙니다. 첫 번째 경우 함수 호출은 문자열 리터럴에 적용되는 것을 알고 있으므로 오버로드 확인을 수행하여 문자열 오버로드를 찾을 수 있습니다. 두 번째 경우

line는 오버로드 WriteLine 메서드 호출의 시점에서 추론을 입력 할 수있는 미해결 타입의 변수, 그래서 선택하는 과부하 알고하지 않습니다, 그것은 문자열 인수를 볼 수 없습니다 아직, 타입 추론은 왼쪽에서 오른쪽이다.

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

하고 작동에

변경을, line에 대한 형식 유추 변수가 들어오는 "foo는"에서 string와 통일받을 것이기 때문에이 전에이 WriteLine 전화를 결정해야합니다.

그래서 키는 왼쪽에서 오른쪽 유형의 추론입니다. 형식 변수에 대한 해결책이 없으면 과부하를 아직 선택하지 못할 수도 있습니다.

관련 문제