You can implicitly upcast, but I find that explicit casting makes things more clear.
Clearer, perhaps. But also slower. Boxing and Unboxing doesnt come free of cost :)
If all types share some properties or methods (template) that is the same ina ll types, use a baseclass and have all of them inherit from it. Then use the basetype is the working type when putting stuff into and out of the array. That way, no casting is needed when getting them out of the array.