【问题标题】:A property, indexer or dynamic member access may not be passed as an out or ref parameter [duplicate]属性、索引器或动态成员访问不能作为 out 或 ref 参数传递[重复]
【发布时间】: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),即使它显然是这个问题的一次性;)
  • 谢谢,也许我会在我在这里发帖时保留它:)

标签: c# .net struct pass-by-reference


【解决方案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; }

【讨论】:

    猜你喜欢
    • 2012-09-08
    • 2011-09-23
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2019-07-23
    • 2020-11-26
    相关资源
    最近更新 更多