3

我的班级中有两个数组,并尝试通过以下方式访问它们。第一个适用于 theta,但第二个无法为 delta_theta 编译。不使用这个做第二个数组的正确方法是什么?

错误说: 错误 1 ​​错误的数组声明符:要声明托管数组,排名说明符位于变量标识符之前。要声明一个固定大小的缓冲区字段,请在字段类型之前使用 fixed 关键字。

protected double[] theta = null;
protected double[] delta_theta = null;
public double this[int index] {
        get { return theta[index]; }
        set { theta[index] = value; }
}
public double Delta_Theta[int index]
{
        get { return delta_theta[index]; }
        set { delta_theta[index] = value; }
}
4

3 回答 3

3

您不能在纯 C# 代码中为索引器指定名称,也不能创建多个具有相同参数类型的索引器并按名称区分它们。

您可以为要使用的其他语言(支持命名索引器)指定一个名称,DefaultMemberAttribute但您不能自己使用该名称。(COM 组件除外,然后仅在 C# 4 及更高版本中。)

相反,您必须公开某种类型的属性,该属性本身会公开相关的索引器。现在,如果您想要获取和设置,您可以将数组公开为只读属性,可能为IList<double>

// Names changed to be more conventional
public IList<double> DeltaTheta
{
    get { return deltaTheta; }
}

然后客户仍然可以使用:

foo.DeltaTheta[10] = 5.5;

例如。

对于只读版本,您可以公开ReadOnlyCollection<double>

public ReadOnlyCollection<double> DeltaTheta
{
    get { return new ReadOnlyCollection<double>(deltaTheta); }
}

或者为了避免每次都这样做,您可以为包装器设置一个字段:在构造函数中对其进行初始化,然后每次都返回相同的包装器引用。

于 2013-01-25T22:17:10.460 回答
1

在同一个类中没有办法做到这一点 - 索引器必须是形式this(arguments),所以你不能有 2 个使用相同类型的索引。

您可以做的是创建内部类,以将索引重定向到您的数组并Delta_Theta返回此类。

public IndexRedirector Delta_Theta 
{ 
  get { return new IndexRedirector { RedirectedArray:delta_theta }; 
}

class IndexRedirector
{ 
  public double[] RedirectedArray;
  public double this[int index] {
    get { return RedirectedArray[index]; }
    set { RedirectedArray[index] = value; }
  }
}
于 2013-01-25T22:16:21.583 回答
1

您可以创建一个包装索引器:

protected double[] theta = null;
protected double[] delta_theta = null;

public double this[int index] {
        get { return theta[index]; }
        set { theta[index] = value; }
}

public Indexer DeltaTheta { 
      // can be optimized according to delta_theta lifecycle
      get {return new Indexer(delta_theta);} 
}

// internal indexere wrapper
public class Indexer{
      double [] _data;
      public DoubleIndexer(double[] data ){   
          _data = data;
      }

      public double this[int index] {
            get { return _data[index]; }
            set { _data[index] = value; }
      }
}

并像这样使用:

obj[2]               // -> theta[2]
obj.DeltaTheta[5]    // -> delta_theta[5]
于 2013-01-25T22:28:03.247 回答