2009-09-02 13 views
6

Ich erhalte einen merkwürdigen Fehler, wenn ich F # verwende, um ein public readonly Mitglied eines Strukturtyps zu lesen, der in einer C# -Assembly definiert ist.Zugriff auf öffentliche readonly-Member von Strukturen in externen Assemblies

// 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 useless ab dem Zeitpunkt des Schreibens dieses Artikels. Es scheint merkwürdig, dass man ein unveränderliches Mitglied einer Klasse lesen kann, und man kann ein veränderliches Mitglied einer Struktur lesen, aber man kann kein unveränderliches Mitglied einer Struktur lesen. Ein Workaround ist einfach genug, aber ich bin neugierig: Ist das ein Fehler im Compiler?

Edit: Ich legte einen Fehlerbericht

+0

Heh, jetzt erstellt Ihre nutzlose Verbindung und Endlosschleife, da dies das einzige Ergebnis ist. – MichaelGG

Antwort

3

Normalerweise [email protected], wenn die Leute sagen, ‚es wie ein Fehler in dem Compiler sucht‘, der Code für "Ich weiß nicht, was ich ist Ich tue'. In dieser Situation sieht es jedoch wie ein Fehler aus.

Der F # -Compiler erstellt eine Kopie von Strukturen hinter den Kulissen, falls sie mutiert werden. (Deshalb müssen Sie, auch wenn Sie eine Struktur mit veränderbaren Feldern definieren, die Instanz dieser Struktur als änderbar kennzeichnen, bevor Sie ihre Felder aktualisieren können.) Es scheint, dass die besondere Magie hinter den Kulissen über "schreibgeschützte" Strukturfelder vergisst.

Während das Internet und Stackoverflow ein großartiger Ort ist, um Hilfe zu bitten, über F # Fragen in Beziehung stehenden, bitte das Fis-Team über alle Fehler, die Sie durch eine E-Mail [email protected] finden wissen zu lassen.

+0

Danke, ja ich war mir nicht sicher, ob ich irgendwo nur einen dummen Fehler machte, daher die Frage. Fehlerbericht gesendet. – Gabriel