2016-03-12 6 views
-1

Не удалось найти ответ на эту проблему, возможно, потому, что терминология является туманной.Почему не удается получить доступ к элементам переменной напрямую через оператор точки?

struct Container 
{ 
    public int a, b, c; 
} 
class Packer 
{ 
    public Container box { get; set; } 
    public void PackBox() 
    { 
     box.a = 100; // CS1612 "Cannot modify the return value of 'Packer.box" because it is not a variable" 

     Container _box = box; 
     _box.a = 100; 
     box = _box; // legal 
    } 
} 

Так у меня есть вопрос теории и практический вопрос:

  • Почему не «» быть доступны непосредственно? Есть ли какой-то случай, когда это не просто сокращение для обходного пути _box?
  • Как я могу избежать использования обходного пути kludgy _box? В моем конкретном случае проблема заключается в том, что я хочу использовать свойство класса с {get; защищенный набор; } доступ.

ответ

1

Проблема в том, что box на самом деле является свойством (то есть вызовом метода), который возвращает копию поля поддержки. Изменение копии не влияет на исходное значение. Поскольку это тонкая проблема, а не то, что кому-то хотелось бы, она определена в спецификации C# как ошибка.

Именно поэтому следует тщательно учитывать использование изменяемых типов значений. Семантика копирования типов значений может легко привести к неожиданным результатам.

Работа вокруг не имеет этой проблемы, потому что копия сделана, изменена, а затем записана обратно, вызвав средство настройки свойства. Он работает так, как вы ожидали. Если вы не хотите этого делать, то вы не можете использовать свойство, реализованное автоматически. Вам нужно напрямую получить доступ к базовому полю.

Для чего VB.NET позволяет использовать код, эквивалентный первому примеру, и я видел ошибки из-за этой точной проблемы. Если бы код был написан на C#, у нас не было бы ошибки, потому что он был бы пойман как ошибка компилятора.

+0

Спасибо, я никогда не думал о том, как изменчивость связана со свойствами. –

 Смежные вопросы

  • Нет связанных вопросов^_^