f# - 访问外部程序集中结构的公共(public)只读成员

标签 f# struct immutability readonly member

当我使用 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"

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

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

最佳答案

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

F# 编译器会在幕后复制结构,以防它们发生变异。 (这就是为什么即使你定义了一个带有可变字段的结构,你也必须将该结构的实例属性为可变,然后才能更新它的字段。)看起来幕后发生的特殊魔法忘记了“只读”结构字段。

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

关于f# - 访问外部程序集中结构的公共(public)只读成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1368438/

相关文章:

f# - F#在Mono 2.10上崩溃

c# - 我可以在不装箱的情况下通过反射为结构设置值吗?

c++ - 用变量替换结构成员名称

constants - D中的const和不可变有什么区别?

java - 如何在 Java 中识别不可变对象(immutable对象)

f# - F# 中的底部/未定义值?

f# - 如何从函数中返回特定的可区分联合

string - FSharp.Core.String 中的 concat 与 System.String 中的 Concat

c - 结构类型的完成是否对同一范围内该类型的所有先前声明有效?

javascript - 避免递归函数中的状态突变(Redux)