1

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

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

m_settings.Length编译时的论点。我怎么能解决这个问题?

  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);
                }
4

2 回答 2

5

我怎么能解决这个问题?

不这样做 :) 无论如何,您希望它如何工作?假设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参数而不是参数outTryXXX
  • 您忽略了 的返回值TryGetInt32,我希望它是成功/失败值。为什么要默默地忽略失败?
于 2012-09-15T18:40:46.347 回答
2

使用临时局部变量:

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

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

  • 你不检查返回值TryGetInt32——如果转换失败怎么办?
  • 真的可以m.settings.Length写吗?
于 2012-09-15T18:40:25.450 回答