外部アセンブリ内の構造体のパブリック読み取り専用メンバーへのアクセス

StackOverflow https://stackoverflow.com/questions/1368438

質問

F# を使用してファイルを読み取ると、奇妙なエラーが発生します。 public readonly 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

F# 1.9.6.16 で Client.exe をコンパイルすると、最後の行で次のエラーが発生します。

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

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

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

役に立ちましたか?

解決

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top