为什么不接受元组类型作为多维数组索引?

时间:2018-11-24 01:18:01

标签: c#

我想知道为什么它不能按照我期望的方式工作。这是“运送就是选择”的问题,还是有很好的实际原因,我所期望的行为是有问题的。

考虑以下变量定义:

int[,] a

此功能签名

(int, int) FindIndex(int[,] a)

鉴于这些,我希望它能起作用:

int index = a[FindIndex(a)];

但是没有,它给出了:

  

CS0022 []中错误的索引数;预期2

我没有检查规格,但是我确定这与规格一致,因此我不怀疑实现是否正确,确实如此。我想知道的是,有什么实际的原因和/或考虑因素导致对此不予支持?

1 个答案:

答案 0 :(得分:1)

完全愚蠢的类将元组作为索引器

public class MyFunkyArray<T> : IEnumerable<T>
{
    public MyFunkyArray() { }

    public MyFunkyArray(T[,] buffer) => Buffer = buffer;

    public T[,] Buffer { get; set; }

    public T this[(int, int) tuple]
    {
        get => Buffer[tuple.Item1, tuple.Item2];
        set => Buffer[tuple.Item1, tuple.Item2] = value;
    }

    public IEnumerator<T> GetEnumerator() => ToEnumerable(Buffer).GetEnumerator();

    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

    public IEnumerable<T> ToEnumerable(Array target) => target.Cast<T>();
}

用法

var array = new MyFunkyArray<int>(new int[2, 2]);

var tuple = (1, 1);

array[tuple] = 3;

foreach (var val in array)
    Console.WriteLine(val);

输出

0
0
0
3

注意 :这仅是出于学术目的,价值有限


其他资源

Indexers (C# Programming Guide)

  

索引器允许对类或结构的实例进行索引,就像   数组。无需显式设置或检索索引值   指定类型或实例成员。索引器类似于属性   除了访问器带有参数之外。