Erreur du compilateur CS1612

Impossible de modifier la valeur de retour de 'expression' car il ne s’agit pas d’une variable

Vous avez tenté de modifier un type valeur qui est généré comme résultat d’une expression intermédiaire mais qui n’est pas stocké dans une variable. Cette erreur peut se produire quand vous essayez de modifier directement un struct dans une collection générique, comme illustré dans l’exemple suivant :

List<MyStruct> list = {…};  
list[0].Name = "MyStruct42"; //CS1612  

Pour modifier le struct, assignez-le tout d’abord à une variable locale, modifiez la variable, puis réassignez la variable à l’élément dans la collection.

List<MyStruct> list = {…};  
MyStruct ms = list[0];  
ms.Name = "MyStruct42";  
list[0] = ms;  

Cette erreur se produit car les types valeur sont copiés lors de l’assignation. Quand vous récupérez un type valeur à partir d’une propriété ou d’un indexeur, vous obtenez une copie de l’objet, et non une référence à l’objet proprement dit. La copie retournée n’est pas stockée par la propriété ou l’indexeur, car il s’agit en fait de méthodes, et non d’emplacements de stockage (variables). Vous devez stocker la copie dans une variable que vous déclarez avant de pouvoir la modifier.

L’erreur ne se produit pas avec les types référence, car une propriété ou un indexeur retourne dans ce cas une référence à un objet existant, qui est un emplacement de stockage.

Si vous définissez la classe ou le struct, vous pouvez éliminer cette erreur en modifiant votre déclaration de propriété pour fournir l’accès aux membres d’un struct. Si vous écrivez du code client, vous pouvez éliminer l’erreur en créant votre propre instance du struct, en modifiant ses champs, puis en réassignant le struct entier à la propriété. Une troisième solution consiste à convertir votre struct en classe.

Exemple

L’erreur CS1612 se produit également quand vous essayez d’accéder au membre d’un struct par l’intermédiaire d’une propriété d’une classe englobante qui retourne le struct entier, comme illustré dans l’exemple suivant :

// CS1612.cs  
using System;  
  
public struct MyStruct  
{  
    public int Width;  
}  
  
public class ListView  
{  
    public MyStruct Size { get; set; }
}  
  
public class MyClass  
{  
    public MyClass()  
    {  
        ListView lvi;  
        lvi = new ListView();  
        lvi.Size.Width = 5; // CS1612  
  
        // You can use the following lines instead.  
        // MyStruct ms;  
        // ms.Width = 5;  
        // lvi.Size = ms;
    }  
  
    public static void Main()
    {  
        MyClass mc = new MyClass();  
        // Keep the console open in debug mode.  
        Console.WriteLine("Press any key to exit.");  
        Console.ReadKey();
    }  
}  

Voir aussi