C# 2D GameObject array, why are these two pieces of code not identical?

This first way of assigning GameObjects to the array works for the entire thing, but why does the second way only work once before it breaks and start throwing typecasting errors? Should they both not do the same thing?

this.cubes[x,y] = Instantiate(cubePrefab, pos, Quaternion.identity) as GameObject;

this.cubes[x,y] = (GameObject)Instantiate(cubePrefab, pos, Quaternion.identity);

Here is the whole body of code:

    private GameObject[,] cubes;
	public Transform cubePrefab;
	
	
	void Setup(int numOfCubesX, int numOfCubesY)
	{
		Vector3 pos = new Vector3(0f,0f,0f);
		this.cubes = new GameObject[numOfCubesX, numOfCubesY];
		for(int x = 0; x < numOfCubesX; x++)
		{
			for(int y = 0; y < numOfCubesY; y++)
			{
				pos.x = x * 1.5f;
				pos.y = y * 1.5f;
				Debug.Log("making cube at (" + x + "," + y);
				this.cubes[x,y] = Instantiate(cubePrefab, pos, Quaternion.identity) as GameObject;
			} 
		}
	}

Those two statements are doing different things, and respond differently if they can’t convert between the source type and target type.

From as (C# Reference):

The as operator is like a cast operation. However, if the conversion isn’t possible, as returns null instead of raising an exception.

From Casting and Type Conversions (C# Programming Guide):

a type cast that fails at run time will cause an InvalidCastException to be thrown

The as statement is effectively ignoring the problem and continuing, whereas the explicit cast is properly throwing an exception.