Невозможно передать это по ссылке, это только для чтения

Получение этого сообщения об ошибке довольно запутанно, так как фраза this.property = value абсолютно верна. совершенно очевидно, что это можно использовать для установки значений. Однако при передаче этого в качестве ссылки в функцию возникает ошибка, указывающая выше. Как это можно передать в функцию, ожидающую ссылку?


person Azeranth    schedule 11.06.2018    source источник
comment
Было бы здорово, если бы вы могли предоставить минимально воспроизводимый пример. Несмотря на то, что вы добавили ответ, вопрос очень неясен.   -  person mjwills    schedule 12.06.2018


Ответы (1)


Ключевое слово this не очень интуитивно понятно при использовании в качестве параметра. Следующее должно помочь прояснить это.

public void myFunction(ref myClass input) {}

— это функция, которая ожидает ссылку на экземпляр myClass, например, если вы собираетесь вызывать эту функцию откуда-то, где экземпляр myClass может быть локальной переменной. Довольно странно, хотя следующее выдает ошибку

myFunction(ref this);

что не имеет смысла, когда this находится в определении myClass. Проблема возникает из-за того, что this не является переменной. Вместо этого он должен быть передан Object. this является изменяемым, то есть функции, которые получают его в качестве параметра, могут его изменить, и объект, на который ссылается this, также изменится, в отличие от типов с семантикой передачи по значению (int, long, object, dynamic).

Чтобы решить эту проблему, создайте перегрузку для myFunciton(), которая ожидает myClass вместо ref myClass.

В качестве дополнительного важного примечания: попытка input = new myClass не сработает. Это приведет к сбою вашей программы, поэтому никогда не передавайте this в функцию, которая пытается напрямую установить значение своих входных данных. Это связано с тем, что вы не можете назначить ссылку this, хотя свойства this доступны и поэтому могут быть установлены с помощью this.

this доступен только для чтения, свойства this — нет. Это необычное свойство, уникальное для этого, и я действительно думаю, что было бы интересно, если бы я действительно мог использовать его намеренно.

person Azeranth    schedule 11.06.2018
comment
To solve this, create an overload for myFunciton() which expects myClass instead of ref myClass Или сделайте var bob = this;, затем myFunction(ref bob);. - person mjwills; 12.06.2018
comment
«Это необычное свойство, уникальное для этого». Это верно для всех свойств readonly с полями не только для чтения, которые легко создать. - person Dour High Arch; 12.06.2018
comment
@mjwills Нет, это создает прослойку между этим и Бобом, что означает, что изменения в бобе не сохраняются до this - person Azeranth; 12.06.2018
comment
@Azeranth - да точно так же, как ваше решение, которое я цитировал. Мое решение действует точно так же, как ваше, но его легче кодировать (нет необходимости писать совершенно новую перегрузку функции) . - person mjwills; 13.06.2018