2012-05-24 2 views
3

내가이 개 C# 코드에서 선언 된 클래스가 : 올바른 과부하가 미리 선언해야 out 매개 변수 유형에 의해 결정되기 때문에 C 번호에서 B.TryParse를 호출하는 동안F # : 정적 과부하를 지정하는 방법은 무엇입니까?

public class A 
{ 
    public static bool TryParse(string value, out A result) 
    { 
     ... 
    } 
} 

public class B : A 
{ 
    public static bool TryParse(string value, out B result) 
    { 
     ... 
    } 
} 

는 문제가되지 않습니다. out 매개 변수는 F #에서 결과의 일부로 변형되었으므로 동일한 매개 변수 시그니처가있는 두 개의 함수가 있습니다 ... F #에서 호출하면 A unique overload for method 'TryParse' could not be determined based on type information prior to this program point. A type annotation may be needed. 오류가 발생합니다. 문제를 이해하고 심지어 TryParsenew ...으로 선언 할 수도 있습니다. 정적이지 않은 경우

메시지 자체는별로 도움이되지 않습니다. 어떤 종류의 주석과 어디에 추가해야하는지 명확히하지 않습니다.

이 전화는 어떻게해야합니까? 가장 바보 같은 생각은 함수 중 하나의 이름을 바꾸는 것이지만 더 영리한 방법이있을 수 있습니까?

답변

4

try 메소드에 전달할 변수에 유형 주석을 추가해야합니다.이 경우 out 변수는 변경되는 것입니다. 이 같은 뭔가 일을해야한다고 생각 :

let res, (b:B) = B.TryParse "MyString" 

F #에서 유형 약어가 식별자 후에 와서 콜론 (:) 앞에있다.

(참고 : 밖으로 F #으로 매개 변수는 결과에서 튜플로 복구 할 수 있습니다) 문제를 해결하기위한 몇 가지 방법이 있습니다

+4

리턴 값의 유형을 지정하고 F #이 오버로드를 유추 할뿐만 아니라 다음과 같이 원하는 오버로드를 직접 지정할 수 있습니다.'(Int32.TryParse : string -> bool * int) "4"' –

3

:

  • 을 (로버트 제안으로) 명시 적 타입 주석을 추가 .
  • out 매개 변수에서 반환 된 값을 함수의 매개 변수가 "B"유형으로 알려진 이후의 함수 호출에 대한 인수로 유지하는 변수를 사용하십시오. 함수의 매개 변수가 (명시 적 형식 주석을 추가하여) 형식 'B'로 명시 적으로 선언되는 경우이 방법이 가장 효과적입니다.
  • 정적으로 처리 된 제네릭을 사용하여 전달 된 개체의 TryParse 메서드를 호출하는 인라인 도우미 함수를 만듭니다.