Allora, quando tu scrivi "new int[10]" stai dicendo al framework: creami un oggetto di tipo array di int di 10 elementi. Il framework lo crea da qualche parte in memoria (nel managed heap) e restituisce l'indirizzo dell'oggetto appena creato (ossia il riferimento ad esso), che viene, nel nostro caso, memorizzato in array. In sostanza, quindi, la variabile che tu dichiari come "int [] array" altro non è che un puntatore ad un oggetto-array, ossia un "contenitore di indirizzo". Quando tu assegni array ad array2 il contenuto di array viene copiato in array2, ma, visto che il contenuto di array è un puntatore all'oggetto-array effettivamente esistente nell'heap, array2 di fatto conterrà tale puntatore, e quindi entrambe le variabili punteranno allo stesso oggetto-array.