class Program
    {
        static void Main(string[] args)
        {
            A a1 = new A(1);
            A a2 = new A(2);            A a = null;
            a = a1;    
            Console.WriteLine(a.id.ToString());   //  正确
            A[] arr=null;                          //空应用            arr[0] = a;
            Console.WriteLine(arr[0].id.ToString());   //错误 ,为什么呢?
            Console.ReadLine();
        }
    }    public class A
    {
        public int id;
        public A(int i)
        {
            id = i;
        }
    }几乎同样的c++代码却可以:
class A
{
public:
int id;
A()
{
}
A(int i)
{
id=i;
}
};
int main(int argc, char* argv[])
{
A a1(1);
        A a2(2);
A* arr[2];     //空指针 arr[0]=&a1;
printf("%d\n",arr[0]->id); //正确
return 0;
}

解决方案 »

  1.   

     A[] arr=null; 這個錯了 
      

  2.   


    打错字了arr[0] = a;改成 arr[0] = a1;
      

  3.   

    A[] arr=new A[1];                          //空应用            arr[0] = a;
                Console.WriteLine(arr[0].id.ToString());  //错误 ,为什么呢? 
      

  4.   

    A[] arr = null; 不给分配空间,是不行的吧
      

  5.   

    A[] arr=new A[1];                          
    这样是可以的,我想知道为什么c++ 空数组指针可以指向一个有效的对象,而c#的空数组引用不可以应用一个有效的对象。
      

  6.   

    这就是C#与C++的不同了,C#的这种做法可以保证安全,不能操作空引用的变量,所有的变量必须实例化
      

  7.   

    同意上边,最明显的就是 A[] arr=null;                          //空应用 我不能100%确定这么写不可以,但是实际上我从来没有见过这种写法,应该不能用这个来初始化数组。
      

  8.   


    那为什么下面的空应用a可以正确的应用有效的对象呢?
                A a = null; 
                a = a1;    
      

  9.   


    这样写是可以的。我的想法是:
    A[] arr=new A[1];  //已经用默认构造函数产生了一个对象。  
    arr[0]=a1;         //引用了另外一个对象,那原来的对象呢?相当于产生的一个多余的对象。就像下面的语句
    A a = null; 
    a = a1;   谁也不会像下面这样写一样A a = new A();  //产生了不必要的一个对象。
    a = a1;   但实际上
                A[] arr=null;                         
                arr[0] = a1; 
    这样却不行。
      

  10.   


    这样写是可以的。我的想法是:
    A[] arr=new A[1];  //已经用默认构造函数产生了一个对象。  
    arr[0]=a1;         //引用了另外一个对象,那原来的对象呢?相当于产生的一个多余的对象。就像下面的语句
    A a = null; 
    a = a1;   谁也不会像下面这样写一样A a = new A();  //产生了不必要的一个对象。
    a = a1;   但实际上
                A[] arr=null;                         
                arr[0] = a1; 
    这样却不行。
      

  11.   



                A[] arr=null;                        
                arr[0] = a1; //这也是给arr[0]赋值啊,就相当于它初始化了,实际上不可以,不知道为什么? 
      

  12.   

    突然想到,A[] arr是类Array的对象,也就是说,不是类A的对象,不知道是不是这个原因。
      

  13.   

    arr是个数组,你没有初始化它的长度
    其实你只要细心点就可以发现了,为什么A a = null;
    a = a1;这样没错而A[] arr=null;
    arr[0] = a1;有错呢
    你没看到arr是用了索引[0]吗?
    a和arr都是一个对象,没有初始化不能使用它的属性,方法或索引
    a=a1;这是给a赋值
    arr[0]=a1,这是给arr[0]赋值,不是给arr赋值
      

  14.   

    嗯,有道理,我把
    A[] arr=null;改成 A[2] arr=null;这样是不可以的,有方法实现这样的目的吗?就是初始化一定长度的数组,但是数组的元素都是null?
      

  15.   

    可以,只要A[] arr = new A[10];这样arr里面的数组就全是null了
    但这样做有什么意义吗
      

  16.   

    先结贴。A[] arr = new A[10];这样arr里面的数组全是null了吗?应该都是有效的对象了吧,而且是用默认构造函数初始化的对象吧?回去测试看看。
      

  17.   

    试了一下,真是null,真是奇怪。