Frage

Ich erhalte einen seltsamen Fehler, wenn ich F # ein public readonly Mitglied einer Strukturtyp in einer C # Assembly definiert zu lesen.

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

Wenn ich Client.exe mit F # 1.9.6.16, die letzte Zeile gibt den Fehler kompilieren:

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

Das Web ist nutzlos ab dem Zeitpunkt des Schreibens dieses Artikels. Es scheint seltsam, dass man ein unveränderliches Mitglied einer Klasse lesen kann, und man kann ein veränderbares Mitglied einer Struktur lesen, aber man kann nicht ein unveränderliches Mitglied einer Struktur lesen. Eine Abhilfe ist leicht genug, aber ich bin neugierig: Ist das ein Bug im Compiler

Edit: Ich legte einen Fehlerbericht an fsbugs@microsoft.com

War es hilfreich?

Lösung

Normalerweise, wenn die Leute sagen, ‚es sieht aus wie ein Bug im Compiler‘, der Code ist für ‚Ich weiß nicht, was ich tue.‘ In dieser Situation jedoch sieht es aus wie ein Bug sein.

Das F # -Compiler erstellt eine Kopie von Strukturen hinter den Kulissen, falls sie mutiert bekommen. (Aus diesem Grunde, auch wenn Sie eine Struktur mit veränderbaren Feldern definieren müssen Sie die Instanz dieser Struktur als wandelbar Attribut, bevor Sie seine Felder aktualisieren.) Es scheint, dass die besondere Magie hinter den Kulissen auf vergisst ‚Read-only‘ struct Felder aus.

Während das Internet und Stackoverflow ein großartiger Ort ist, um Hilfe zu bitten, über F # Fragen in Beziehung stehenden, Sie bitte das F # Team weiß über alle Fehler, die Sie von E-Mailing fsbugs@microsoft.com finden lassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top