2009-09-02 3 views
6

F #을 사용하여 C# 어셈블리에 정의 된 구조체 유형의 public readonly 멤버를 읽는 데 이상한 오류가 발생합니다.외부 어셈블리에서 구조체의 공용 읽기 전용 멤버에 액세스

"The address of the variable 'copyOfStruct' may not be used at this point" 

웹이이 글을 쓰는 시점의 같은 useless이다 : 나는 F # 1.9.6.16로 client.exe가를 컴파일 할 때

// C#: compile to Lib.dll 
namespace Lib 
{ 
    public class MyClass { public readonly int ReadonlyFoo; } 

    public struct MyStruct 
    { 
     public readonly int ReadonlyFoo; 
     public int WriteableFoo; 
    } 
} 

// F#: compile to Client.exe 
open Lib 
let myClass = new MyClass() 
printfn "MyClass.ReadonlyFoo = %x" myClass.ReadonlyFoo 

let myStruct = new MyStruct() 
printfn "MyStruct.WriteableFoo = %x" myStruct.WriteableFoo 
printfn "MyStruct.ReadonlyFoo = %x" myStruct.ReadonlyFoo 

는, 마지막 줄은 오류를 제공합니다. 클래스의 불변 멤버를 읽을 수 있고 struct의 변경 가능한 멤버를 읽을 수 있지만 구조체의 변경 불가능한 멤버를 읽을 수 없다는 것은 이상한 것처럼 보입니다. 해결 방법은 충분히 쉽지만 궁금합니다. 컴파일러의 버그입니까?

편집 : 나는 사람들이 코드는 '내가 모르는'입니다 '는 컴파일러의 버그처럼 보이는'말할 때 일반적으로

+0

ㅎ, 이제 쓸모없는 링크가 만들어지고 무한 루프가 발생합니다. – MichaelGG

답변

3

[email protected]하기 버그 리포트를 제출 나는하고있다. ' 그러나이 상황에서는 버그처럼 보입니다.

F # 컴파일러는 변형 된 경우 구조의 뒤에서 구조체의 복사본을 만듭니다. (따라서 필드를 변경할 수있는 구조체를 정의하더라도 필드를 업데이트하기 전에 해당 구조체의 인스턴스를 변경할 수있는 속성으로 지정해야합니다.) 장면 뒤에서 발생하는 특수한 마술은 '읽기 전용'구조체 필드를 잊어 버리는 것처럼 보입니다. 인터넷과 StackOverflow의이 F 번호가 문제 - 관련에 대해 도움을 요청 수있는 좋은 장소이지만

, 는 F 번호 팀은 [email protected] 이메일로 당신이 발견 한 버그에 대해 알려 주시기 바랍니다.

+0

고마워, 그래, 어쩌면 어리석은 실수를 저질렀는지 모르겠다. 버그 보고서가 제출되었습니다. – Gabriel

관련 문제