访问外部程序集中的结构的公共只读成员

时间:2009-09-02 15:35:45

标签: f# struct immutability readonly member

当我使用F#读取C#程序集中定义的结构类型的public readonly成员时,我遇到了一个奇怪的错误。

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

截至撰写本文时,网络为useless。看起来奇怪的是,人们可以读取类的不可变成员,并且可以读取结构的可变成员,但是不能读取结构的不可变成员。解决方法很简单,但我很好奇:这是编译器中的错误吗?

编辑:我向fsbugs@microsoft.com提交了错误报告

1 个答案:

答案 0 :(得分:3)

通常当人们说'看起来像编译器中的错误'时,代码是'我不知道我在做什么'。然而,在这种情况下,它确实看起来像一个错误。

F#编译器在后台制作结构的副本,以防它们发生变异。 (这就是为什么即使你定义一个具有可变字段的结构,你必须将该结构的实例归为可变,然后才能更新它的字段。)看来幕后发生的特殊魔法会忘记'readonly'结构字段。

虽然互联网和StackOverflow是寻求F#相关问题帮助的好地方,但请通过发送电子邮件fsbugs@microsoft.com 让F#团队了解您发现的任何错误。< / p>

相关问题