属性、索引器或动态成员访问不能作为 out 或 ref 参数传递[重复]
Posted
技术标签:
【中文标题】属性、索引器或动态成员访问不能作为 out 或 ref 参数传递[重复]【英文标题】:A property, indexer or dynamic member access may not be passed as an out or ref parameter [duplicate] 【发布时间】:2011-06-16 08:16:22 【问题描述】:您好,我无法解决这个问题。我有这些结构和类。
struct Circle
...
class Painting
List<Circle> circles;
public List<Circle> circles
get return circles;
我正在尝试使用以下代码从绘画类外部修改其中一个圆圈:
MutatePosition(ref painting.Circles[mutationIndex], painting.Width, painting.Height);
这一行给我一个编译器错误:
属性、索引器或动态成员 访问可能不会作为输出或 参考参数
为什么会这样,在不过多更改代码的情况下我可以做些什么来解决它?
【问题讨论】:
顺便说一句 - 我喜欢你的别名(CantMutate),即使它显然是这个问题的一次性;) 谢谢,也许我会在我在这里发帖时保留它:) 【参考方案1】:错误很明显 - 您不能将属性传递给方法的 ref 参数。
你需要做一个临时的:
var circle = painting.Circles[mutationIndex];
MutatePosition(ref circle, painting.Width, painting.Height);
painting.Circles[mutationIndex] = circle;
话虽如此,可变结构通常是个坏主意。您可能需要考虑将其设为类而不是结构。
【讨论】:
只是一个问题,为什么像我一样访问结构算作访问属性?如果我访问列表本身,我可以理解。 @CantMutate:您正在访问该属性:ref painting.Circles[mutationIndex]
。这是在通过属性获取列表后使用索引器(这是一种属性)。
@Jon Skeet:谢谢,也许是时候回到 C# 书了!
+1,但这与可变结构没有太大关系。查看您发布的更正样本;没有要求 Circle
是一个可变类型才能工作。 MutatePosition
可以用新的Circle
完全替换circle
的存储位置,并且更改将过滤。
@Ani:当然——我的意思是可变结构是个坏主意——与这个问题分开。这更像是“作为一个班级这可能会更好”的评论。【参考方案2】:
如果 MutatePosition 只有一个 ref 参数并且没有返回类型,则可以返回该值。
painting.Circles[mutationIndex] = MutatePosition(circle, painting.Width, painting.Height);
如果有多个 ref 参数和/或已经有一个返回类型,您可以创建一个包含需要返回的所有内容的新类型。
class MutateResults() Circle Circle; object OtherReffedStuff;
【讨论】:
以上是关于属性、索引器或动态成员访问不能作为 out 或 ref 参数传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章