2016-04-12 11 views
5

Gibt es eine Problemumgehung für den Fehler CS1663 ("Puffertyp fester Größe muss einer der folgenden sein: Bool, Byte, Kurz, Int, Lang, Char, Sbyte, Ushort, Uint, Ulong, Float oder Double.")?Problemumgehung beim Deklarieren eines unsicheren festen benutzerdefinierten Struct-Arrays?

Ich muss ein unsicheres festes Array von einem anderen blittable benutzerdefinierten Typ-Struktur deklarieren, aber ich bin in diesem Compiler-Fehler stecken.

Zeigt einen Code, um das Problem zu klären.

struct s1 
{ 
    byte _b1; 
    byte _b2; 
} 

unsafe struct s2 
{ 
    fixed s1 _s1[5]; // CS1663 here... 
} 

Beachten Sie, dass die beiden Strukturen blitable sind, so dass der Fehler keinen Sinn für mich macht.

Jeder hat eine Idee, was ich tun könnte?

Danke.

+0

Haben Sie unsicher 'struct s2 { feste s1 s1 [5] bedeuten; } '? –

+0

Ja !!! Ich werde diesen kleinen Fehler im Code-Snippet beheben, danke. Irgendwelche Gedanken zu diesem @ VadimMartynov? – ptr0x

+0

Nun, Sie haben nur einen Syntaxfehler. Sie sollten Feldmodifikatoren (wie private, fixed, readonly, static und andere), Feldtyp (wie Byte, int, s1, string) und Feldname deklarieren (jeder Name, der verwendet wird, um Ihre Variablen zu referenzieren. Ihr Feld fehlt Geben Sie (s1) ein Lesen Sie mehr über das Deklarieren fester Puffer: https://msdn.microsoft.com/en-us/library/zycewsya(v=vs.80).aspx –

Antwort

0

Es ist eine Einschränkung von fixed size buffers.

Das feste Array kann alle Attribute oder Modifikatoren annehmen, die für reguläre Strukturelemente zulässig sind. Die einzige Einschränkung ist, dass die Array-Typ bool, byte, char, kurze, int, , lange, ushort, uint, ULONG sbyte sein muß, float oder double.

Sie können nur diese Typen verwenden, aber keine Kombination (wie struct enthält nur diese Typen). Es gibt keinen Unterschied, ob Ihr Typ Bittabelle ist oder nicht. Du kannst es einfach nicht benutzen.

Dann können Sie Ihre benutzerdefinierte struct nicht für den Puffer fester Größe verwenden.

Problemumgehung? Mmmm, ja, kann sein. Sie können Ihren Code-Struktur verändern und so etwas wie folgt verwenden:

unsafe struct s2 
{ 
    fixed byte _b1[5]; 
    fixed byte _b2[5]; 
} 
+0

Beantworten Sie meinen Kommentar oben: "@VadimMartynov Ich weiß, dass ich einen Syntaxfehler habe: D Meine Frage dreht sich um das" Warum "Ich bekomme diesen Syntaxfehler.Der einzige Grund für diesen Fehler, den ich mir vorstellen kann, besteht darin, das Speichern eines nicht blitbaren Typs im Speicher zu vermeiden. Der Punkt ist, dass mein Typ tatsächlich blitable ist. Es muss ein Workaround für diese Einschränkung geben, dies sollte ein sehr häufiges Problem sein. " – ptr0x

+0

Ihre Problemumgehung stimmt nicht mit meinem Beispiel überein! In Ihrem Beispiel werde ich einen linearen Rohpuffer mit 5 Elementen erhalten, die _b1 und 5 Elemente repräsentieren _b2 In meinem Beispiel sollte der Puffer im Speicher die gleiche Größe haben, aber anders organisiert sein: zuerst 1 Element von _b1, dann 1 Element von _b2 usw. – ptr0x

+0

Nun, das ist der Grund, warum diese Problemumgehung als Workaround bezeichnet wird. –

Verwandte Themen