6 Stimmen

Auf öffentlich schreibgeschützte Member von Strukturen in externen Assemblys zugreifen

Ich erhalte einen seltsamen Fehler, wenn ich F# verwende, um ein public readonly-Element eines in einer C#-Assembly definierten Strukturtyps zu lesen.

// C#: Kompilieren in Lib.dll
namespace Lib
{
    public class MyClass { public readonly int ReadonlyFoo; }

    public struct MyStruct
    {
        public readonly int ReadonlyFoo;
        public int WriteableFoo;
    }
}

// F#: Kompilieren in 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 kompiliere, gibt die letzte Zeile den Fehler aus:

"Die Adresse der Variablen 'copyOfStruct' darf an dieser Stelle nicht verwendet werden"

Das Internet ist nutzlos zum Zeitpunkt dieser Niederschrift. Es scheint seltsam, dass man ein unveränderliches Element einer Klasse lesen kann und man ein veränderliches Element einer Struktur lesen kann, aber man kann kein unveränderliches Element einer Struktur lesen. Ein Workaround ist jedoch leicht genug, aber ich frage mich: ist das ein Fehler im Compiler?

Bearbeitung: Ich habe einen Fehlerbericht an fsbugs@microsoft.com gesendet

3voto

Chris Smith Punkte 17414

Normalerweise, wenn Leute sagen 'es sieht wie ein Fehler im Compiler aus', bedeutet das 'Ich weiß nicht, was ich mache'. In dieser Situation jedoch scheint es tatsächlich wie ein Fehler zu sein.

Der F# Compiler macht heimlich Kopien von Strukturen, falls sie verändert werden. (Deshalb, selbst wenn du eine Struktur mit veränderbaren Feldern definierst, musst du die Instanz dieser Struktur als veränderlich kennzeichnen, bevor du ihre Felder aktualisieren kannst.) Es scheint, als würde bei dem speziellen Zauber, der im Hintergrund passiert, die 'schreibgeschützten' Strukturfelder vergessen.

Während das Internet und StackOverflow ein großartiger Ort sind, um Hilfe bei F#-bezogenen Problemen zu suchen, lass das F# Team bitte wissen, wenn du auf Fehler stößt, indem du eine E-Mail an fsbugs@microsoft.com schickst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X