Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Kan de retourwaarde van 'expressie' niet wijzigen omdat het geen variabele is
Er is geprobeerd een waardetype te wijzigen dat wordt geproduceerd als resultaat van een tussenliggende expressie, maar niet is opgeslagen in een variabele. Deze fout kan optreden wanneer u probeert een struct rechtstreeks te wijzigen in een algemene verzameling, zoals wordt weergegeven in het volgende voorbeeld:
List<MyStruct> list = {…};
list[0].Name = "MyStruct42"; //CS1612
Als u de struct wilt wijzigen, wijst u deze eerst toe aan een lokale variabele, wijzigt u de variabele en wijst u de variabele vervolgens weer toe aan het item in de verzameling.
List<MyStruct> list = {…};
MyStruct ms = list[0];
ms.Name = "MyStruct42";
list[0] = ms;
Deze fout treedt op omdat waardetypen worden gekopieerd bij de toewijzing. Wanneer u een waardetype ophaalt uit een eigenschap of indexeerfunctie, krijgt u een kopie van het object, niet een verwijzing naar het object zelf. De kopie die wordt geretourneerd, wordt niet opgeslagen door de eigenschap of indexeerfunctie omdat het eigenlijk methoden zijn, niet opslaglocaties (variabelen). U moet de kopie opslaan in een variabele die u declareert voordat u deze kunt wijzigen.
De fout treedt niet op bij verwijzingstypen omdat een eigenschap of indexeerfunctie in dat geval een verwijzing naar een bestaand object retourneert, een opslaglocatie.
Als u de klasse of struct definieert, kunt u deze fout oplossen door de eigenschapsdeclaratie te wijzigen om toegang te verlenen tot de leden van een struct. Als u clientcode schrijft, kunt u de fout oplossen door uw eigen exemplaar van de struct te maken, de velden ervan te wijzigen en vervolgens de volledige struct weer toe te wijzen aan de eigenschap. Als derde alternatief kunt u uw struct wijzigen in een klasse.
Opmerking
CS1612 treedt ook op wanneer u probeert toegang te krijgen tot het lid van een struct via een eigenschap in een insluitklasse die de volledige struct retourneert, zoals wordt weergegeven in het volgende voorbeeld:
// 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();
}
}