属性、索引器或动态成员访问不能作为 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 参数传递[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C#接口

意外的标记。构造函数、方法、访问器或属性应为角度 5

virtual这个关键字有啥用

如何解决“意外的令牌:预期的构造函数、方法、访问器或属性”错误?

IIS配置好了却不能访问网站

重写(override)与重载(overload)的区别