ProductCatalog[productSpecifications = null] <-- that is your code right?
if so, why are you setting productSpecifications to null in the indexer?
otherwise, outofbounds usually means something like this...
string[] mystringarray = new string[3]
^^ that array will have 4 valid objects...
mystringarray[0]
mystringarray[1]
mystringarray[2]
mystringarray[3]
but if you do mystringarray[4], that's out of bounds. so you just have to make sure that the variable you use to retrieve an index of an array is within the bounds of the array.
to see how big an array is use the 'length' variable
Code:
int length = mystringarray.length