Question

Je reçois une erreur étrange lorsque j'utilise F # pour lire un membre de public readonly d'un type struct défini dans un assemblage 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

Quand je compile Client.exe avec F # 1.9.6.16, la dernière ligne donne l'erreur:

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

Le web est inutile à la rédaction de ce document. Il semble étrange que l'on peut lire un membre immuable d'une classe, et on peut lire un membre mutable d'un struct, mais on ne peut pas lire un membre immuable d'une struct. Une solution de contournement est assez facile, mais je suis curieux: est-ce un bogue dans le compilateur

Edit: J'ai présenté un rapport de bogue à fsbugs@microsoft.com

Était-ce utile?

La solution

Normalement, quand les gens disent « il ressemble à un bogue dans le compilateur » qui est le code pour 'Je ne sais pas ce que je fais. Dans cette situation, cependant, il ne semble être comme un bug.

Le compilateur F # fait une copie de struct dans les coulisses en cas où ils se muter. (Ceci est la raison pour laquelle, même si vous définissez un struct avec des champs mutables vous devez attribuer l'instance de cette struct mutable avant de pouvoir mettre à jour ses champs.) Il semble que la magie se passe derrière les coulisses oublie readonly champs struct.

Alors que l'Internet et StackOverflow sont un excellent endroit pour demander de l'aide sur les F # questions concernant la PI, S'il vous plaît ne laissez l'équipe F # avertir des bugs que vous trouvez en envoyant un courriel fsbugs@microsoft.com .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top