拥有多个具有相同签名的索引器

Having multiple Indexer with the same signature

是否可以有两个或多个具有相同签名的索引器(或类似的东西)?

所以它看起来像这样

    private int[,] X;
    public int this[int a]
    {
        set
        {
            X[a, 0] = value;
        }

    }
    public int this[int a]
    {
        set
        {
            X[a, 1] = value;
        }
    }

这会出错,因为这两种方法都是无名的并且具有相同的签名。那么是否可以命名这些方法但保留设置值的能力。即

C.FirstCol(2) = 3; //Same as C.X[2,0] = 3
C.SecondCol(5) = 4; //Same as C.X[5,1] = 4

编辑:我会尝试更好地解释它:

可以使用属性将行 C.SetX(value) 更改为 C.X = value

可以使用索引器

将行C.Set(num, value)更改为C[num] = value

我想问的是如何更改这些行

C.SetA(num, value)
C.SetB(num, value)

C.A[num] = value
C.B[num] = value

或者

C.A(num) = value
C.B(num) = value

没有 A 或 B 作为数组

这不可能 - 编译器如何知道您要使用哪个索引器?并且没有您希望示例中包含的语法。

可以这样介绍方法:

public void FirstCol(int rowIndex, int value)
{
    X[rowIndex, 0] = value;
}

和类似的第二列等。但老实说,我看不出有什么意义。也许引入二维索引器会更好?

您可以创建索引包装器:

class Indexer
{
  private int[,] data;
  private int index;

  public Indexer(int index, int[,] data)
  {
    this.index = index;
    this.data = data;
  }

  public int this[int a]
  {
    set {data[a,index] = value;}
  }
}

然后在您的代码中使用它:

class Foo
{
  private int[,] data;
  private readonly Indexer first;
  private readonly Indexer second;

  public Foo()
  {
    first = new Indexer(0, data);
    second = new Indexer(1, data);
  }

  public Indexer First
  {
    get{ return first;}
  }

  public Indexer Second
  {
    get{ return second;}
  }
}

现在你可以说:

Foo f = new Foo();
f.First[2] = 3;
f.Second[5] = 4;

这个答案是示范性的,但不一定实用。如果你这样定义 class:

class Indexer<TKey, TValue>
{
    Func<TKey, TValue> getter;
    Action<TKey, TValue> setter;
    public Indexer(Func<TKey, TValue> getter, Action<TKey, TValue> setter)
    {
        this.getter = getter;
        this.setter = setter;
    }
    public TValue this[TKey key]
    {
        get { return getter(key); }
        set { setter(key, value); }
    }
}

你可以这样使用它:

Indexer<int, int> firstColumn = new Indexer<int, int>(
    i => X[i, 0],
    (i, v) => X[i, 0] = v);
public Indexer<int, int> FirstColumn
{
    get { return firstColumn; }
}

Indexer<int, int> secondColumn = new Indexer<int, int>(
    i => X[i, 1],
    (i, v) => X[i, 1] = v);
public Indexer<int, int> SecondColumn
{
    get { return secondColumn; }
}

哪个会让你这样做:

C.FirstColumn[2] = 3;
C.SecondColumn[4] = 5;

但是,我不建议这样做!简单地使用方法 Set(int i, int j, int value) 或索引器 int this[int i, int j].

会更直接

您可以使用二维索引器(如果我理解正确的话!):

private int[,] X;
public int this[int row, int column]
{
    set
    {
        X[row, column] = value;
    }

}

像这样使用:

C[2, 0] = 3;
C[5, 1] = 4;