日期:2014-05-18  浏览次数:20841 次

C#索引器所带来的严重冲突,语法是否滥用了中括号“[]”???
如果一个类定义了一个索引器,然后这类又实例化了一个对象数组,就像下面这样:
C# code

class test
    {
        private int[] myint = new int[10];
        public string name = "hello world";

        public test()
        {
            for (int i = 0; i < 10; i++)
            {
                myint[i] = i;
            }
        }
        public int this[int n]
        {
            get
            {
                return myint[n];
            }
            set
            {
                myint[n] = value;
            }
        }
    }
    static void Main(string[] args)
    {
        test[] t = new test[10];
        Console.WriteLine(t[5]);
    }


然后,当我们使用t[5]的时候,C#就分不出这个t[5]是什么了!
索引器的本意是把一个对象的 全部或部分字段 看做一个集合,用数组的方式来使用对象的字段成员,这样当对象本身就是一个数组时岂不引发严重的语法冲突??? 这是否是滥用了数组概念的外延?

我觉得索引器应该使用大括号"{}",而不是使用“[]”,这样既可以避免语法冲突,又可以与数学的习惯相符合,因为在数学里表示一个离散的集合就是以“{}”来表示的,例如{1,3,5,7,9}. 而一个类里面的字段总是一个有限的离散结合。

------解决方案--------------------
我想你没明白问题所在。
问题在于你的test[]中的所有成员都是null。

对于C#来说,定义一个数组并不会导致这个数组的元素已经被初始化。例如:
object[] o = new object[100];
这里的o[0]-o[99]都是null.
必须像你上面的写的test的构造函数中的那样:
C# code
test[] t = new test[10]
for(int i =0;i<10;i++)t[i]=new test();

------解决方案--------------------
楼主没明白数组的意思

test[] t1 
test t
是两个不一样的东西
t1 其实是Array 而非 test
通过[] 不是调用的索引器