Feste Felder in .NET sind etwas ganz Besonderes. Ein festgelegtes Feld, das Sie haben (public fixed byte foo[10]
), wird in eine spezielle verschachtelte Struktur kompiliert, und der Typ Ihres festen Feldes wird in diese verschachtelte Struktur geändert. Kurz gesagt, dieses:
public fixed byte foo[10];
erhält in dieser zusammengestellt:
// This is the struct that was generated, it contains a field with the
// first element of your fixed array
[CompilerGenerated, UnsafeValueType]
[StructLayout(LayoutKind.Sequential, Size = 10)]
public struct <foo>e__FixedBuffer0
{
public byte FixedElementField;
}
// This is your original field with the new type
[FixedBuffer(typeof(byte), 10)]
public <foo>e__FixedBuffer0 foo;
Sie diese mit einem Tool wie ILSpy selbst sehen können.
Nun, wenn der Code in C# eine Linie hat GetString(obj.foo)
es kompiliert wird in:
GetString(&obj.foo.FixedElementField);
so wörtlich er die Adresse des ersten Elements des Arrays nimmt und leitet es als Parameter der Methode (daher ist der GetString
Parameter vom richtigen Typ, byte*
).
Wenn Sie die gleiche Methode mit dem gleichen Parameter in IronPython aufrufen, ist der Parametertyp immer noch der Typ Ihres Felds: <foo>e__FixedBuffer0
, das nicht in byte*
(offensichtlich) umgewandelt werden kann. Die richtige Methode, um diesen Methodenaufruf zu machen, wäre dieselbe Ersetzung wie der C# -Compiler - nehmen Sie die Adresse FixedElementField
und übergeben Sie sie an die GetString
, aber leider hat Python (nach meinem Wissen) kein Analog zu der &
Operator in C#.
Die Schlussfolgerung wäre: Sie können nicht direkt auf ein festes Feld von IronPython zugreifen. Ich würde sagen, dass die beste Wahl ist, eine „Proxy“ Methode zu haben, wie:
public string GetFooString(Baz baz)
{
return new string((sbyte*)baz.foo);
}
PS Ich bin kein Profi Ironpython, so vielleicht gibt es einen Super-Weg ist direkt auf den foo prop zugreifen, aber ich nur sehe nicht wie.
Was ist Cchar? Ich kann keinen Bezug finden für das, was es sein soll. Oder meintest du nur Char? –
Cchar ist Byte, er hat vergessen, mit Hilfe von Cchar = System.Byte; in der Frage. Ersetzung seiner öffentlichen festen Cchar foo [10] mit öffentlichen festen Byte foo [10] – Joe
Ich änderte die Frage in die Verwendung von "Byte". –