我在使用C#时遇到了这个错误信息:
属性或索引器不能作为 out 或 ref 参数传递
我知道这个错误的原因,并且采取了快速解决方案,创建一个正确类型的本地变量,将其作为 out
/ref
参数调用函数,然后将其赋回属性:
RefFn(ref obj.prop);
转化为
{
var t = obj.prop;
RefFn(ref t);
obj.prop = t;
}
如果属性在当前上下文中不支持 get 和 set,则此方法显然会失败。
为什么C#不直接为我做到这一点呢?
我能想到的唯一可能产生问题的情况是:
- 线程
- 异常
对于线程,这种转换会影响写入发生的时间(在函数调用之后与在函数调用中),但我认为任何依赖于此的代码在出现问题时都将得到很少的同情。
对于异常,问题在于:如果函数分配给多个 ref 参数之一,那么会发生什么情况?任何简单的解决方案都会导致所有参数都被分配或者全部不被分配。再次强调,我认为这不是语言的所支持的使用方式。
注意:我理解为什么会生成这个错误信息的机制。我想知道的是,为什么C#不自动实现这个微不足道的解决方法的原因。
T
的属性不应该只有getter和setter方法,而应该还有一个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);
)。 - supercat