Pergunta

Estou recebendo um erro estranho quando uso f# para ler um public readonly Membro de um tipo de estrutura definido em uma montagem 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

Quando compilar o cliente.exe com f# 1.9.6.16, a última linha fornece o erro:

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

A web é sem utilidade Até o momento da redação deste artigo. Parece estranho que se possa ler um membro imutável de uma classe e pode -se ler um membro mutável de uma estrutura, mas não se pode ler um membro imutável de uma estrutura. Uma solução alternativa é fácil o suficiente, mas estou curioso: isso é um bug no compilador?

Edit: enviei um relatório de bug para fsbugs@microsoft.com

Foi útil?

Solução

Normalmente, quando as pessoas dizem 'parece um bug no compilador' que é um código para 'Eu não sei o que estou fazendo'. Nesta situação, no entanto, parece ser um bug.

O compilador F# faz uma cópia de estruturas nos bastidores, caso sejam mutadas. (É por isso que, mesmo se você definir uma estrutura com campos mutáveis, deve atribuir a instância dessa estrutura como mutável antes de atualizar seus campos.) Parece que a mágica especial acontecendo nos bastidores esquece os campos de estrutura 'leitura'.

Enquanto a Internet e o Stackoverflow são um ótimo lugar para pedir ajuda sobre questões relacionadas a F#, Por favor, informe a equipe F# sobre todos os bugs que você encontrar enviando um e -mail para fsbugs@microsoft.com.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top