Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Не удалось изменить возвращаемое значение "expression", т. к. оно не является переменной
Была предпринята попытка изменить тип значения, полученный в результате промежуточного выражения, но этот тип не хранится в переменной. Эта ошибка может возникнуть при попытке напрямую изменить структуру в универсальной коллекции, как показано в следующем примере:
List<MyStruct> list = {…};
list[0].Name = "MyStruct42"; //CS1612
Чтобы изменить структуру, сначала назначьте локальную переменную, измените ее, а затем снова присвойте эту переменную элементу в коллекции.
List<MyStruct> list = {…};
MyStruct ms = list[0];
ms.Name = "MyStruct42";
list[0] = ms;
Эта ошибка возникает, поскольку типы значений копируются при назначении. Извлекая тип значения из свойства или индексатора, вы получаете копию объекта, а не ссылку на этот объект. Свойство или индексатор не сохраняют полученную копию, поскольку по сути являются методами, а не местами хранения (переменными). Копию необходимо сохранить в переменную; перед изменением эту переменную следует объявить.
Данная ошибка не возникает в связи со ссылочными типами, поскольку в этом случае свойство или индексатор возвращают ссылку на существующий объект, который является местом хранения.
При определении класса или структуры эту ошибку можно устранить, изменив объявление свойства таким образом, чтобы оно предоставляло доступ к членам структуры. При написании кода клиента эту ошибку можно устранить, создав собственный экземпляр структуры, изменив его поля, а затем снова назначив всю структуру свойству. Третий вариант — это изменить структуру на класс.
Пример
Ошибка CS1612 также возникает при попытке доступа к члену структуры через свойство внешнего класса, которое возвращает структуру целиком, как показано в следующем примере:
// 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();
}
}