2009-08-13 1 views
3

나는 C#에서 정의하는이 사용하고 라이브러리 중 하나는 다음 parameterSet이의 인스턴스로 설정하더라도,F #에서 out 매개 변수로 사용하는 C# 메서드로 개체를 전달하면 작동하지 않습니다?

let parameterSet = new ParameterSet(); 
let retVal = currentPanel.GetParameterSet(name, ref parameterSet); 

그러나 :

public ushort GetParameterSet(string name, out ParameterSet parameterSet) 

나는 F 번호에서이 전화를하려고 해요 는 C# 1에있어서의 유효 데이터와 그 클래스, 그것은 F 번호에 변경되지 않는다.

무엇이 여기에 누락 되었습니까?

답변

4

는 방법은 밖으로 있었던 파라미터를 기다리고 때, ref 매개 변수로 인스턴스를 전달해서는 안

// let parameterSet = null; 
let retval, parameterSet = currentPanel.GetParamterSet(name); 

시도 (이는 out 키워드 앞에 할당되지 않은 참조해야 호출시).

+0

와우 좋은 ... 그럼 왜 fsharp가 ref 키워드를 가지고 있고 그것이 작동하지 않는다면 (당신의 btw가) – TimothyP

+0

'ref'와'out'의 구분은 순전히 C#의 구별입니다. "외부"- 예를 들어, VB는 그것을 가지고 있지 않으며, C#'ref'와'out'을'ByRef'로 취급 할 것입니다. 초기화 된 변수를 out 매개 변수에 전달하는 것은 괜찮습니다. C#에서도 변수 _must_가 할당 취소 될 필요는 없습니다. –

+0

나는 너를 알았어 * 할 수 없다는 것을 의미했다. 그러나 저는 이것이 이것이 C#이라는 것을 알지 못했습니다. 단지 그것이 CLR 일이라고 생각했습니다. 설명 주셔서 감사합니다! –

11

우선 코드가 다음과 같이 작동하지 않는 이유는 무엇입니까? ref은 F #에서 C#과 동일한 의미를 가지지 않습니다. F #에서 'a ref유형입니다. 이 중, 마법이 아니다 - 그것은 다음과 같이 정의, 하나의 필드 contents 정말 그냥 레코드의 :

type 'a ref = { mutable contents : 'a } 

그것은 는 지역 변수에 대한 포인터 또는 참조하지 않습니다. 당신이 쓸 때 따라서,이 : 이렇게

let x = 0 
let y = ref x 

당신은하지 변수 yx를 참조해야합니다. 대신, 변수 yint ref이고 contents의 값은 x (즉 0)으로 초기화됩니다. 다음과 같이 변경할 수 있습니다.

y.contents <- 1 

이 변경 사항은 x의 값으로 변경되지 않습니다. contents

F #도 'a ref에 대한 구문 당을 제공합니다. 특히,이 :

y.contents <- y.contents + 1 

쓸 수 짧아 :

y := !y + 1 

따라서 :=contents에 할당하는 속기이고 ! 그 값을 판독하는 단축형이다.

ref에 대한 자세한 내용은 MSDN의 Reference Cells을 참조하십시오.

이제

F 번호를 사용하면 byref 인수 (IL에 byref에 C#을지도 모두 refout)을 예상하는 외국 기능에 해당 유형의 인스턴스를 통과 할 수 'a ref 유형과 관련된 마법 캐스팅을 가지고 있습니다. 이 경우 함수가 인수의 값을 변경하면 ref 인스턴스의 contents 값이 그에 따라 변경됩니다.귀하의 예에서 ref parameterSetref의 새 인스턴스를 만들고 그것을 변경 한 함수로 전달한 다음이를 버렸다.

let mutable parameterSet = new ParameterSet() 
let retVal = currentPanel.GetParameterSet(name, &parameterSet) 
: 당신은 byref로 직접 함수에 전달하는 마법의 & 연산자를 사용 후 변경 가능한 지역 변수를 선언 할 let mutable를 사용하고, 수, 또는

let parameterSet = ref(new ParameterSet()) 
let retVal = currentPanel.GetParameterSet(name, parameterSet) 
... 
// use parameterSet.contents as needed 

: 당신은 무엇을 했어야하는 것은 이것이다

관련 문제