5 votes

Pourquoi ne puis-je pas utiliser GcHandle.Alloc pour épingler un tableau d'enums ?

Je souhaite procéder comme suit :

public enum Blah
{
    A,B
}

[Test,Explicit]
public void TestEnumGcHandle()
{
    var ea = new Blah[10];
    GCHandle.Alloc(ea, GCHandleType.Pinned);
}

mais je comprends :

System.ArgumentException : Object contains non-primitive or non-blittable data.

Est-ce que les Enums .net sont des types blittables ? (Marshalling) affirme que les Enums sont blittables, mais je ne peux pas épingler un tableau d'Enums. Serait-ce un bogue dans GcHandle.Alloc ? J'utilise .NET 3.5.

4voto

Hans Passant Points 475940

C'est un peu lourd à mon avis, mais les enums ne sont pas primitifs (typeof(Blah).IsPrimitive is false) et ne sont pas blittables. Il est absent de la liste des types blittables . Le lien de la question du SO est erroné à ce sujet. Le problème est qu'il n'y a aucun moyen de connaître la taille du type intégral sous-jacent pour l'énumération native. Je pense qu'il s'agit d'une lourdeur, car il y a certainement un moyen de la spécifier dans le type de l'énumération gérée. Eh bien, je ne peux pas le faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X