Вопрос, конечно, по чистому C#. Но тег Unity3d я поставил, потому что пример оттуда.
Есть два класса:
public class A : MonoBehaviour
{
Vector2 vec = Vector2.zero;
void Start()
{
vec.x = 10f;
}
}
public class B : MonoBehaviour
{
Vector2 vec {get; set; }= Vector2.zero;
void Start()
{
vec.x = 10f;
}
}
Единственное отличие - свойство (get; set; структура).
Тут стоит уточнить, что Vector2 - это структура (struct), а не класс (class). Vector2 имеет несколько полностью публичных (public) полей, одно из которых - x.
В первом классе всё замечательно! Поле x у структуры Vector2 меняется на 10f и никаких ошибок. Во втором классе есть ошибка: "CS1612 Не удалось изменить возвращаемое значение 'B.vec', т. к. оно не является переменной". Я понимаю, что присутствие свойства вызывает ошибку... Но я не понимаю почему? Свойства как-то особенно работают со структурами из-за того, что они не являются ссылочными типами?
Так вот, мой вопрос. Почему наличие свойства "{get; set;}" (и любого другого свойства с "get"-ером) запрещает мне менять поля структуры (struct)?
int Value { get; set; }превращает в самые обычные методыint GetValue ()иvoid SetValue (int value)и мы получаем только копию не ссылочного типа. – Yaroslav Nov 24 '23 at 01:52var copy = vec; copy.x = 10; vec = copy;или простоvec = new Vector2(10, vec.y);. – VladD Nov 24 '23 at 01:55