나는 모든 속성 Id와 Legacy_id를 가지고 있다고 알고있는 여러 유형의 객체를 비교해야합니다. 불행히도 유형이 데이터베이스 스키마에서 왔기 때문에 인터페이스를 추가 할 수 없습니다. 다음과 같은 비교기가 작동하기를 기대했습니다.유형 유추가 입력 내용이 유형에 존재하는지 자동으로 결정하지 않는 이유는 무엇입니까?
type Comparer<'T >()=
interface System.Collections.Generic.IEqualityComparer<'T> with
member this.Equals (o1:'T,o2:'T)=
o1.Legacy_id=o2.Legacy_id
member this.GetHashCode(o:'T)=
o.Id+o.Legacy_id
또한 유형이있는 비교 자 유형의 인스턴스가 있습니다. 이론적으로 컴파일러는 충분한 정보를 가지고 있습니다.
그러나 "이 프로그램 지점 이전의 정보를 기준으로 불확정 유형의 개체를 찾습니다. 개체 유형을 제한하기 위해이 프로그램 지점 전에 형식 주석이 필요할 수 있습니다. 이로 인해 조회가 허용 될 수 있습니다. 해결할 것 "이라고 말했다.
여기 F #이 실패하는 이유가 궁금합니다. 실제/이론적 제약이 있습니까 아니면 구현되지 않았습니까? 그런 추론은 매우 유용 할 수 있습니다.
나는 F # 컴파일러에 대한 설명이 앞으로 걷는 것 같다고 생각합니다. C#에는 제한이 없습니다. 그것은 오류 메시지가 불평하는 것입니다. 그래?
주어진''T''가'Id'라는 속성을 가질 수 없기 때문에 이것은 컴파일 될 수 없습니다. 이 클래스를'Comparer'으로 인스턴스화하면 어떻게 될까요? –
@FyodorSoikin하지만 Compareer으로 인스턴스화하지 않습니다. 그래서 올바른 유형으로 인스턴스화 할 때까지 컴파일 작업이 가능합니다. –
alehro
그래도 상상해보십시오. int를 시도하면 어떻게 될 것이라고 생각합니까? –