Comment obtenir l'adresse d'une structure dans sa méthode?
Je suis en mesure d'obtenir l'adresse d'une structure en dehors de sa méthode (instance), comme indiqué ci-dessous:
public struct Values
{
public byte A;
public byte B;
public byte C;
public byte D;
public static unsafe bool Equals(Values lhs, Values rhs)
{
return *(int*) &lhs == *(int*) &rhs;
}
}
Mais quand j'essaye d'obtenir l'adresse de la structure elle-même, l'EDI me dit que c'est faux:
public unsafe bool Equals(Values other)
{
return *(int*) &this == *(int*) &other;
}
Le message d'erreur est:
Vous ne pouvez prendre l'adresse d'une expression non corrigée qu'à l'intérieur d'un initialiseur d'instructions fixes.
L'instruction fixed empêche le garbage collector de déplacer une variable mobile. Mais cette structure n'est pas une variable mobile et ne sera pas récupérée, non?
Mis à jour
Ce dont j'ai réellement besoin, c'est d'obtenir / définir la valeur des Nth octets par index. Bien que je puisse le faire via l'instruction switch, mais ce sera plus rapide grâce à l'index. Grâce à @KonradKokosa, le tampon de taille fixe répond à mes besoins. Je veux toujours connaître la réponse à la question principale.
Réponses
Vous ne pouvez pas prendre une adresse de la thisméthode d'instance de structure interne car "cette structure n'est pas une variable mobile" n'est pas une instruction vraie. La structure peut être encadrée, et donc immédiatement elle devient mobile. La méthode d'instance ne sait pas si elle est appelée à partir d'une structure encadrée ou non encadrée.
Notez qu'il s'agit actuellement d'une limitation permanente également pour ref structs, bien qu'elle puisse être levée. Ainsi, le code ci-dessous produit toujours la même erreur de compilation:
public ref struct C {
public void M() {
var ptr = &this;
}
}
Cependant, vous pouvez prendre des adresses de structures dans un premier extrait de code:
public static unsafe bool Equals(Values lhs, Values rhs)
{
return *(int*) &lhs == *(int*) &rhs;
}
car vous prenez ici des adresses d'arguments locaux, passés par valeur (copies de Values, à la fin).