. .Item
메소드를 이미 구현 한 .Net 라이브러리가 있습니다. 이 라이브러리를 사용하는 코드에서 F #의 유형 확장자로 추가 메소드 추가
namespace Library2
type A() =
member m.Item with get(a: string) = printfn "get a string"
member m.Item with get(a: int) = printfn "simple slice"
, 나는 동일한 이름의 하나 추가 방법을 추가 할 (그러므로
optional extensions
입니다) :
이
#r @"Library2.dll"
open Library2
type A with
member m.Item with get(a: bool) =
printfn "get a bool"
다음 예제의 마지막 줄은 컴파일되지 않습니다 :
let a = new A()
a.["good"]
a.[10]
a.[true]
F# doc는 말한다 :
확장 메서드는 가상 메서드 나 추상 메서드가 될 수 없습니다. 그들은 같은 이름의 다른 메서드를 오버로드 할 수 있지만 모호한 호출의 경우에는 컴파일러가 확장이 아닌 메서드에 환경 설정을 제공합니다.
즉, .ToString/.GetHashCode
을 동일한 유형의 시그니처로 확장 할 수 없지만 다른 형식 시그니처를 사용합니다. 새로운 방법을 확장 할 수없는 이유는 무엇입니까? 원래 Library2.A
클래스를 발견,
public static class MyModule
{
public static void Item(this A a, bool b)
{
// whatever
}
}
이 컴파일러는 .Item(...)
방법을 찾고, 그리고 실패
이상한 점은 Intellisense가 세 가지 과부하를 모두 표시한다는 것입니다. – Daniel
예. 이것은 나를 혼란스럽게합니다 ... –