【问题标题】:A property, indexer or dynamic member access may not be passed as an out or ref parameter? [duplicate]属性、索引器或动态成员访问不能作为 out 或 ref 参数传递? [复制]
【发布时间】:2012-09-08 12:47:54
【问题描述】:

在下面的代码中,我得到了错误

属性、索引器或动态成员访问不能作为 out 或 ref 参数传递?

编译时在m_settings.Lengthargument 上。我该如何解决这个问题?

  public override bool Read(GH_IO.Serialization.GH_IReader reader)
                {
                    if (m_settings != null && m_settings.Length > 0)
                    {
                        reader.TryGetInt32("StringCount", ref m_settings.Length);
                        for (int i = 0; i < m_settings.Length; i++)
                        {
                            reader.TryGetString("String", i, ref m_settings[i]);
                        }
                    }
                    return base.Read(reader);
                }

【问题讨论】:

    标签: c# properties member indexer grasshopper


    【解决方案1】:

    我该如何解决这个问题?

    如果不这样做 :) 你希望它如何工作?假设m_settings 是一个数组,那么数组无论如何都不能改变长度...

    如果您真的需要ref 行为,则需要一个局部变量:

    int length = m_settings.Length;
    reader.TryGetInt32("StringCount", ref length);
    
    // Presumably you want to use length here...
    // Perhaps m_settings = new string[length];  ?
    

    坦率地说,这有点奇怪:

    • TryGetInt32 使用 ref 参数而不是 out 参数,这与普通的 TryXXX 模式不同
    • 您忽略了TryGetInt32 的返回值,我希望它是成功/失败值。为什么要默默地忽略失败?

    【讨论】:

      【解决方案2】:

      使用临时局部变量:

      int temp = 0;
      if (reader.TryGetInt32("StringCount", ref temp)) {
          m_settings.Length = temp;
      }
      

      当然,这仍然留下一些问题:

      • 你不检查TryGetInt32的返回值——如果转换失败怎么办?
      • m.settings.Length 真的可以写吗?

      【讨论】:

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