Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A kifejezés visszatérési értéke nem módosítható, mert nem változó
Kísérlet történt egy olyan értéktípus módosítására, amely egy köztes kifejezés eredményeként jön létre, de nem egy változóban van tárolva. Ez a hiba akkor fordulhat elő, ha egy általános gyűjtemény egyik szerkezetét próbálja közvetlenül módosítani, ahogyan az alábbi példában látható:
List<MyStruct> list = {…};
list[0].Name = "MyStruct42"; //CS1612
A szerkezet módosításához először rendelje hozzá egy helyi változóhoz, módosítsa a változót, majd rendelje vissza a változót a gyűjtemény eleméhez.
List<MyStruct> list = {…};
MyStruct ms = list[0];
ms.Name = "MyStruct42";
list[0] = ms;
Ez a hiba azért fordul elő, mert az értéktípusok másolása a hozzárendelésen történik. Amikor egy tulajdonságból vagy indexelőből lekér egy értéktípust, az objektum másolatát kapja meg, nem pedig magát az objektumot. A visszaadott példányt nem a tulajdonság vagy az indexelő tárolja, mert azok valójában metódusok, nem tárolási helyek (változók). A módosítás előtt egy deklarált változóban kell tárolnia a másolatot.
A hiba nem a hivatkozástípusoknál fordul elő, mert egy tulajdonság vagy indexelő ebben az esetben egy meglévő objektumra mutató hivatkozást ad vissza, amely egy tárolási hely.
Ha az osztályt vagy a szerkezetet definiálja, a hiba megoldásához módosítsa a tulajdonságdeklarációt, hogy hozzáférést biztosítson egy struktúra tagjainak. Ügyfélkód írása esetén a hibát úgy oldhatja meg, hogy létrehozza a saját példányát, módosítja a mezőket, majd a teljes struktúra vissza lesz rendelve a tulajdonsághoz. Harmadik lehetőségként osztályra módosíthatja a szerkezetet.
Példa
A CS1612 akkor is előfordul, ha egy struktúra tagját egy olyan tulajdonságon keresztül kísérli meg elérni, amely egy olyan befoglaló osztályon keresztül történik, amely a teljes szerkezetet adja vissza, ahogy az az alábbi példában látható:
// 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();
}
}