Получение этого сообщения об ошибке довольно запутанно, так как фраза this.property = value
абсолютно верна. совершенно очевидно, что это можно использовать для установки значений. Однако при передаче этого в качестве ссылки в функцию возникает ошибка, указывающая выше. Как это можно передать в функцию, ожидающую ссылку?
Невозможно передать это по ссылке, это только для чтения
Ответы (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
— нет. Это необычное свойство, уникальное для этого, и я действительно думаю, что было бы интересно, если бы я действительно мог использовать его намеренно.
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
readonly
с полями не только для чтения, которые легко создать.
- person Dour High Arch; 12.06.2018
this
- person Azeranth; 12.06.2018