当我使用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提交了错误报告
答案 0 :(得分:3)
通常当人们说'看起来像编译器中的错误'时,代码是'我不知道我在做什么'。然而,在这种情况下,它确实看起来像一个错误。
F#编译器在后台制作结构的副本,以防它们发生变异。 (这就是为什么即使你定义一个具有可变字段的结构,你必须将该结构的实例归为可变,然后才能更新它的字段。)看来幕后发生的特殊魔法会忘记'readonly'结构字段。
虽然互联网和StackOverflow是寻求F#相关问题帮助的好地方,但请通过发送电子邮件fsbugs@microsoft.com 让F#团队了解您发现的任何错误。< / p>