Pregunta

Me estoy poniendo un extraño error cuando utilizo F # para leer un miembro public readonly de un tipo de estructura definida en un conjunto de 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

Cuando compilo Client.exe con F # 1.9.6.16, la última línea da el error:

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

La web es inútil como del momento de escribir esto. Parece extraño que uno puede leer un miembro de inmutable de una clase, y se puede leer un miembro mutable de una estructura, pero no se puede leer un miembro de inmutable de una estructura. Una solución es bastante fácil, pero tengo curiosidad:? Es esto un error en el compilador

Editar: presenté un informe de error a fsbugs@microsoft.com

¿Fue útil?

Solución

Normalmente, cuando la gente dice 'se ve como un error en el compilador' que es código para 'No sé lo que estoy haciendo'. En esta situación, sin embargo, tiene un aspecto a ser como un error.

El F # compilador hace una copia de estructuras detrás de las escenas en caso de que se mutados. (Esta es la razón, incluso si se define una estructura con campos variables se debe atribuir la instancia de esa estructura tan mutable antes de poder actualizar sus campos.) Parece ser que la magia especial pasando detrás de las escenas se olvida de 'sólo lectura' campos struct.

Mientras que el Internet y Stackoverflow son un gran lugar para pedir ayuda sobre temas relacionados con la PI F #, por favor, deje que el equipo de # F sobre cualquier error que encuentre por correo electrónico a fsbugs@microsoft.com .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top