6

public readonlyF#を使用してC#アセンブリで定義された構造体型のメンバーを読み取ると、奇妙なエラーが発生します。

// 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

Client.exeをF#1.9.6.16でコンパイルすると、最後の行に次のエラーが表示されます。

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

この記事の執筆時点では、Webは役に立たない。クラスの不変のメンバーを読み取ることができ、構造体の可変のメンバーを読み取ることができるのに、構造体の不変のメンバーを読み取ることができないのは奇妙に思えます。回避策は簡単ですが、興味があります。これはコンパイラのバグですか?

編集:バグレポートをfsbugs@microsoft.comに送信しました

4

1 に答える 1

3

通常、人々が「コンパイラのバグのように見える」と言うとき、それは「自分が何をしているのかわからない」ためのコードです。ただし、この状況では、バグのように見えます。

F# コンパイラは、構造体が変更された場合に備えて、バックグラウンドで構造体のコピーを作成します。(これが、変更可能なフィールドを持つ構造体を定義する場合でも、そのフィールドを更新する前に、その構造体のインスタンスを変更可能として属性付けする必要がある理由です。) 舞台裏で行われている特別な魔法が、「読み取り専用」の構造体フィールドを忘れているようです。

インターネットと StackOverflow は、F# 関連の問題について支援を求めるのに最適な場所ですが、見つけたバグについては fsbugs@microsoft.com にメールして F# チームに知らせてください

于 2009-09-02T16:54:07.520 に答える