代码之家  ›  专栏  ›  技术社区  ›  Andrew Savinykh

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

c#
  •  -1
  • Andrew Savinykh  · 技术社区  · 7 年前

    我想知道为什么这不是我期望的工作方式。这仅仅是“装运就是选择”的问题,还是有一个很好的实际原因,即我所期望的行为是有问题的。

    考虑这个变量定义:

    int[,] a
    

    这个函数签名

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

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

    int index = a[FindIndex(a)];
    

    但它没有,它给出:

    CS0022[]内的索引数目错误;应为2

    我没有检查规范,但我确信这是符合规范的,所以我不怀疑实现是否正确,它肯定是正确的。我想知道的是,有没有任何实际的理由和/或考虑不支持这一点?

    1 回复  |  直到 7 年前
        1
  •  1
  •   TheGeneral    7 年前

    把元组作为索引器是完全荒谬的

    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)

    索引器允许对类或结构的实例进行索引,就像 阵列。可以不显式地设置或检索索引值 指定类型或实例成员。索引器类似于属性 除了访问器接受参数。