我刚刚在 C# 中工作时遇到了此错误消息
属性或索引器不能作为 out 或 ref 参数传递
我知道导致此问题的原因,并快速解决了创建正确类型的局部变量,并将其作为函数调用的问题out
/ref
参数,然后将其分配回属性:
RefFn(ref obj.prop);
变成
{
var t = obj.prop;
RefFn(ref t);
obj.prop = t;
}
显然,如果该属性不支持当前上下文中的 get 和 set 操作,则会失败。
为什么 C# 不为我做到这一点?
我能想到这可能会导致问题的唯一情况是:
对于线程来说,转换会影响写入发生的时间(在函数调用之后与函数调用中),但我宁愿怀疑任何依赖于此的代码在中断时都不会得到什么同情。
对于例外情况,需要关注的是;如果函数分配给几个之一会发生什么ref
参数比抛出?任何简单的解决方案都会导致所有参数被分配或没有被分配,而有些参数应该分配,有些不应该分配。我再次认为这种语言的使用不会得到支持。
注意:我了解生成此错误消息的机制。我正在寻找的是 C# 不自动实现简单解决方法的基本原理。
因为你正在通过result索引器的,这实际上是方法调用的结果。不能保证索引器属性也有一个 setter,并且当开发人员认为他的属性将在没有调用 setter 的情况下被设置时,通过 ref 传递它会导致开发人员的错误安全。
在更技术的层面上, ref 和 out 传递传入它们的对象的内存地址,并且要设置属性,您必须调用 setter,因此不能保证该属性实际上会被更改,特别是当属性类型为不可变的。 ref 和 out 不只是set方法返回时的值,它们将实际的内存引用传递给对象本身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)