Я только что наткнулся на это сообщение об ошибке, работая на С#
Свойство или индексатор нельзя передавать в качестве параметра out или ref.
Я знал, что вызвало это, и нашел быстрое решение, создав локальную переменную правильного типа, вызвав функцию с ней в качестве параметра out
/ref
, а затем присвоив ее обратно свойству:
RefFn(ref obj.prop);
превращается в
{
var t = obj.prop;
RefFn(ref t);
obj.prop = t;
}
Ясно, что это потерпит неудачу, если свойство не поддерживает получение и установку в текущем контексте.
Почему C# просто не делает это за меня?
Единственные случаи, когда я могу думать о том, где это может вызвать проблемы:
- заправка
- исключения
Для многопоточности это преобразование влияет на то, когда происходит запись (после вызова функции, а не при вызове функции), но я скорее подозреваю, что любой код, который рассчитывает на это, получит мало сочувствия, когда он сломается.
В качестве исключений проблема будет заключаться в следующем; что произойдет, если функция присвоит один из нескольких параметров ref
, а не выбросит? Любое тривиальное решение приведет к тому, что все или ни один из параметров не будет назначен, когда некоторые должны быть, а некоторые не должны быть. Опять же, я не думаю, что это будет поддерживаться использованием языка.
Примечание. Я понимаю, почему генерируются эти сообщения об ошибках. Я ищу объяснение того, почему С# автоматически не реализует тривиальное обходное решение.
T
должно иметь не только методы получения и установки, но и методActUpon<U>([indexparams...,] ActionByRef<T,U> act, ref U param)
. Такой метод позволил бы оператору типаListOfPoints[4].X += something
эффективно выполняться с использованием статического делегата и без замыканий (ListOfPoints.ActUpon(4, (ref Point it, ref param) => {it.X += param;}, ref something);
). - person supercat   schedule 26.06.2012