2009-09-02 6 views
6

Viene visualizzato un errore strano quando utilizzo F # per leggere un membro public readonly di un tipo di struttura definito in un assembly C#.Accesso ai membri di sola lettura di strutture in assembly esterni

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

Quando compilo Client.exe con F # 1.9.6.16, l'ultima riga dà l'errore:

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

Il web è useless a partire dal momento in cui scriviamo. Sembra strano che si possa leggere un membro immutabile di una classe, e si può leggere un membro mutevole di una struttura, ma non si può leggere un membro immutabile di una struttura. Una soluzione è abbastanza facile, ma sono curioso: si tratta di un bug nel compilatore?

Edit: ho presentato un bug report per [email protected]

+0

Heh, ora il tuo collegamento inutile crea e loop infinito in quanto questo è l'unico risultato. – MichaelGG

risposta

3

Normalmente, quando la gente dice 'sembra un bug nel compilatore' che è il codice per 'Io non so quello che ho' sto facendo'. In questa situazione, tuttavia, sembra essere un bug.

Il compilatore F # esegue una copia delle strutture dietro le quinte nel caso in cui vengano mutate. (Questo è il motivo per cui anche se si definisce una struttura con campi mutabili, è necessario attribuire l'istanza di quella struttura come mutabile prima di poter aggiornare i suoi campi.) Sembra che la magia speciale che si svolge dietro le quinte si dimentichi dei campi della struttura 'readonly'.

Mentre Internet e StackOverflow sono un ottimo posto per chiedere aiuto su F # -related problemi, si prega di lasciare che gli # team di F sa su eventuali bug che trovi per email [email protected].

+0

Grazie, sì, non ero sicuro di aver fatto un errore stupido da qualche parte, da qui la domanda. Segnalazione di bug inviata. – Gabriel