Похоже, вы уже получили ответ на свой более крупный вопрос. Но давайте все равно рассмотрим это.
Есть ли способ заставить ключевое слово this действовать как аргумент ref?
Да. Проработайте это логически.
- Аргумент ref создает псевдоним для переменной .
- «this» не является переменной в ссылочном типе
- «this» является переменной в типе значения
- поэтому единственный способ передать «ref this» - это метод экземпляра типа значения.
И на самом деле именно так «это» реализовано в виде значения за кулисами. Если у вас есть (худшая практика! На самом деле не делайте этого) изменяемый тип значения:
struct S
{
private int x;
public void M()
{
this.x = 123;
}
}
...
S s = new S();
s.M();
Поскольку экземпляры S передаются по значению , как получается, что M мутирует s? s должны быть переданы по ссылке! На самом деле генерируемый нами код выглядит так, как если бы вы написали что-то вроде:
struct S
{
private int x;
public static void M(ref S THIS)
{
THIS.x = 123;
}
}
...
S s = new S();
S.M(ref s);
Короче говоря, "this" в структуре уже передается как параметр ref, поэтому нет проблем с его повторной передачей. Это почти всегда ужасная идея , но это законно.