2010-04-14 1 views
3

IDictionary<int,int> (dict tuplist으로 생성)을 F #에서 C#으로 되 돌리려고하지만 System.Collections.IStructuralEquatable 때문에 FSharp.Core에 대한 참조를 포함해야한다고 나와 있습니다.FSharp.Core를 포함하지 않고도 F #에서 C#으로 사전을 반환 할 수 있습니까?

나는 Dictionary<_,_>(dict tuplist)을 반환하려고 시도했지만 아무런 차이가 없습니다.

UPDATE

OK, ME = 바보

난 그냥 내 질문에 포함 생략

중요한 ... 난 Dictionary<_,_>(dict tuplist, HashIdentity.Reference)을 시도,하지만 int이 구조체는 말한다 세부 사항 : F # 레코드에서 사전을 반환하고 이 문제입니다. 동시에 레코드와 사전을 추가했기 때문에 IStructuralEquality를 보았으므로 문제가되는 사전이라고 생각했습니다.

Doh! 죄송합니다 ...

+2

Heh ... 글쎄, 다행스럽게도 알아 냈어. 아마 레코드에 [] 속성을 넣으면 작동 할 것입니다. – Brian

+0

오, 예, 멋지다. 방금 속성이있는 클래스로 전환 했으므로 이제 다시 전환 할 수 있습니다. 감사. – Benjol

+0

대답을 알기 전에 어떤 세부 사항이 중요한지 항상 알기가 어렵습니다. –

답변

3

나는 이것이 작동해야한다고 생각합니다. 공개 서명에 F # 특정 유형을 노출시키지 않으면 C# 프로젝트에서 FSharp.Core.dll 어셈블리를 참조 할 필요가 없습니다 (그래도 F # 라이브러리와 함께 배포해야 함).

간단한 예제를 작성했지만 FSharp.Core을 참조하지 않고 C# 프로젝트를 컴파일 할 수 있습니다. 다음 프로젝트가 당신을 위해 작동한다면 시도해보십시오 : http://dl.dropbox.com/u/5676796/test.zip?

그것은 간단한 F 번호 모듈 선언

:

module Module1 
open System.Collections.Generic 

let getDictionary() = 
    let d = new Dictionary<_, _>() 
    d.[10] <- 1 
    d :> IDictionary<int, int> 

및 C#에서 그것을 참조하는 코드는 다음과 같습니다

var d = Module1.getDictionary(); 
Console.WriteLine("d 10 = " + d[10]); 

는 일부 F 번호를 노출하는 어떤 다른 공공 F 번호 구성원이 있습니까 특정 유형 (F # 레코드 & 식별 조합, F # 목록 등과 같은 항목을 포함 할 수 있음)

+0

답장을 보내 주셔서 감사합니다. 업데이트 된 질문을 참조하십시오. 시간 낭비로 불편을 끼쳐 드려 죄송합니다. 샘플 프로젝트에서 제게 도움이되는 변형입니다. 문제가있는 곳에서 운동하십시오. – Benjol

+0

어쨌든, 당신이 퍼즐을 풀 었음을 기뻐합니다! –

+0

그건 그렇고,이 분만 RWFP를 마쳤습니다. 나는 그것이 얼마나 좋은지 표현하는 데 어려움을 겪는다. 감사. – Benjol

2

(이 사실을 확인하지는 못했지만 용의자입니다 ...)

dict을 호출하면 FSharp.Core가 필요한 IDictionary의 F # 특정 구현이 생성됩니다. 대신 콘크리트 구현으로 Dictionary을 사용하면 작동합니다. new Dictionary<_,_>(dict tupleList) 일 수도 있고 F # 구조를 .NET 사전에 복사하기 때문에 괜찮습니다.

+0

'dict' 함수를 사용하더라도 작동합니다. 'let getDictionary() = dict [10, 1]'이라고 쓰면 C# 프로젝트의 FSharp.Core.dll에 대한 참조없이 잘 컴파일됩니다. 'getDictionary' 함수의 퍼블릭 시그니처에는 F #에 관련된 어떤 것도 포함되어 있지 않습니다 ... –

+0

Ah, hm. OP 질문에 IStructuralEquatable에 대한 참조는 .NET 2.0 대 .NET 4.0에서 동작이 다른지 궁금합니다. – Brian

+0

.NET 2.0에서 (아직 RC 버전을 사용하고 있습니다.) 테스트를 마쳤습니다. 나는 그것을 시험해보기 위해 .NET 4.0을 지금 설치하지 않았습니다 ... (그러나 라이브러리의 공용 서명이 F # 특정 유형을 나타내지 않으면 참조가 필요하다면 상당히 놀랍습니다) –

관련 문제