Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Nie można zmodyfikować zwracanej wartości wyrażenia, ponieważ nie jest to zmienna
Podjęto próbę zmodyfikowania typu wartości, który jest generowany w wyniku wyrażenia pośredniego, ale nie jest przechowywany w zmiennej. Ten błąd może wystąpić podczas próby bezpośredniego zmodyfikowania struktury w kolekcji ogólnej, jak pokazano w poniższym przykładzie:
List<MyStruct> list = {…};
list[0].Name = "MyStruct42"; //CS1612
Aby zmodyfikować strukturę, najpierw przypisz ją do zmiennej lokalnej, zmodyfikuj zmienną, a następnie przypisz zmienną z powrotem do elementu w kolekcji.
List<MyStruct> list = {…};
MyStruct ms = list[0];
ms.Name = "MyStruct42";
list[0] = ms;
Ten błąd występuje, ponieważ typy wartości są kopiowane podczas przypisywania. Gdy pobierasz typ wartości z właściwości lub indeksatora, otrzymujesz kopię obiektu, a nie odwołanie do samego obiektu. Zwrócona kopia nie jest przechowywana przez właściwość lub indeksator, ponieważ są to metody, a nie lokalizacje magazynu (zmienne). Należy zapisać kopię w zmiennej zadeklarowanej przed zmodyfikowaniem.
Błąd nie występuje z typami odwołań, ponieważ właściwość lub indeksator w tym przypadku zwraca odwołanie do istniejącego obiektu, który jest lokalizacją magazynu.
Jeśli definiujesz klasę lub strukturę, możesz rozwiązać ten błąd, modyfikując deklarację właściwości w celu zapewnienia dostępu do składowych struktury. Jeśli piszesz kod klienta, możesz rozwiązać ten problem, tworząc własne wystąpienie struktury, modyfikując jego pola, a następnie przypisując całą strukturę z powrotem do właściwości. Trzecia alternatywa umożliwia zmianę struktury na klasę.
CS1612 występuje również podczas próby uzyskania dostępu do składowej struktury za pośrednictwem właściwości w otaczającej klasie, która zwraca całą strukturę, jak pokazano w poniższym przykładzie:
// 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();
}
}
Opinia o produkcie .NET
.NET to projekt typu open source. Wybierz link, aby przekazać opinię: