Почему компилятор не позволяет мне установить свойство структуры только для чтения? - PullRequest
1 голос
/ 18 июня 2020

Следующий код не компилируется с 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...