Следующий код не компилируется с CS1612 Cannot modify the return value of 'S2.S1' because it is not a variable
:
void Main()
{
var s2 = new S2();
s2.S1.Field = 1; //error on this line
}
readonly struct S1
{
public readonly int Field { set { } }
}
readonly struct S2
{
readonly S1 s1;
public readonly S1 S1 => s1;
}
Если бы структуры не были readonly
, я понимаю, почему компилятор не позволяет, но теперь, когда они readonly
, доступ к свойству полностью безопасен.
Пожалуйста, не помечайте как дублирующие вопросы, которые связаны со структурами, отличными от readonly
- с ними действительно бессмысленно изменять поле на возвращаемое значение, так как структура - это просто копия.
Более того, следующее работает нормально:
void Main()
{
var s2 = new S2();
s2.s1.Field = 1; //accessing the field here instead of the property
}
readonly struct S1
{
public readonly int Field { set { } }
}
readonly struct S2
{
public readonly S1 s1;
public readonly S1 S1 => s1;
}
Почему компилятор не разрешает мой первый пример?
(Это минимальный воспроизводимый пример. В моем реальном случае S1
обертывает класс и имеет свойства, которые делегируются обернутому классу, и я не вижу причины, по которой C#
должен блокировать меня. )
На основании комментариев дам более наглядный пример того, почему readonly
должен предотвращать ошибку:
void Main()
{
GetS1().Field = 1; //this produces an error
GetS2().Field = 1; //this compiles fine
}
struct S1
{
public int Field { set { } }
}
readonly struct S2
{
public int Field { set { } }
}
S1 GetS1()=>new S1();
S2 GetS2()=>new S2();