索引器(智能阵列)

时间:2013-07-02 14:07:18

标签: c# console-application indexer

我们的班主任在Indexers()上给了我们一个程序,当我编译并在我的计算机上执行程序时出现错误

  

错误:1运营商'<'不能应用于'int'类型的操作数   '方法组'

为什么我收到此错误?...并请解释程序的逻辑以及为什么使用索引器,我也得到了 运行时错误
        指数超出范围。必须是非负的且小于
的大小         采集。         参数名称:index

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    namespace ConsoleApplication2
    {
        class Program
        {
            ArrayList array = new ArrayList();
            public object this[int index]
            {
                get
                {
                    if (index < 0 || index >= array.Count)
                    {
                        return (null);
                    }
                    else
                    {
                        return (array[index]);
                    }
                }
                set
                {
                    array[index] = value;
                }
            }
        }
        class Demo
        {
            public static void Main()
            {
                Program p = new Program();
                p[0] = "123";
                p[1] = "abc";
                p[2] = "xyz";
                for (int i = 0; i <p.Count ; i++)
                {
                    Console.WriteLine(p[i]);
                }
            }
        }
    }

3 个答案:

答案 0 :(得分:4)

它失败了,因为编译器找不到名为Count的属性。相反,它找到了一个方法 - 无论是在这里显示的方法,还是Program实现IEnumerable<object>,那么它很可能是Linq的Count扩展方法。

尝试将Count属性添加到Program

class Program
{
    ...

    public int Count
    {
        get { return this.array.Count; }
    }
}

这将解决编译器错误。现在,如果你想知道为什么它正在使用indexers ......我想,因为你的老师想说明如何使用它们。索引器只是syntactic sugar的一小部分,这使得编写p.GetItem(i)之类的代码看起来更干净,p[i]

答案 1 :(得分:2)

我在程序中没有看到Count实现。添加Count实现并尝试重新编译。

    class Program
    {
        ArrayList array = new ArrayList();

        public int Count { get { return array.Count; } }

        public object this[int index]
        {
            get
            {
                if (index < 0 || index >= array.Count)
                {
                    return (null);
                }
                else
                {
                    return (array[index]);
                }
            }
            set
            {
                array[index] = value;
            }
        }
    }

答案 2 :(得分:1)

您应该添加一个Count属性和一个将ArrayList初始化为正确大小的构造函数,如下所示:

class Program
{
    ArrayList array = null;

    public Program(int size)
    {
        array = new ArrayList(size);
    }

    public object this[int index]
    {
        get
        {
            if (index < 0 || index >= array.Count)
            {
                return (null);
            }
            else
            {
                return (array[index]);
            }
        }
        set
        {
            array[index] = value;
        }
    }

    public int Count
    {
        get
        {
            return array.Count;
        }
    }
}