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

时间:2012-09-15 18:35:02

标签: c# properties member indexer grasshopper

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

  

属性,索引器或动态成员访问权限可能不会作为out或ref参数传递?

编译时{p>在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);
                }

2 个答案:

答案 0 :(得分: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参数代替out参数,与普通TryXXX模式不同
  • 你忽略了TryGetInt32的返回值,我希望这是一个成功/失败的价值。你为什么要默默地忽略失败?

答案 1 :(得分:2)

使用临时局部变量:

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

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

  • 您没有检查TryGetInt32的返回值 - 如果转换失败会怎样?
  • m.settings.Length真可写吗?