Everything, absolutely everything is an object, even non-boxed constant 1. In a wider sense of this word, objects in the sense of OOP are all objects of class and structure types, all arrays and boxed forms of primitive types and enumerations.
Also, delegate and event instances are objects of some implicitly defined classes. You can find it out if you use GetType() and Reflection on those instances.
This is much more delicate matter. Please see my past answer and recent article:
Confusion about delegates[
^],
Dynamic Method Dispatcher[
^].
Now.
Never use ArrayList!
This class is made obsolete with v.2.0 when generics were introduced. Use
System.Collections.Generic.List
instead.
The element type can be absolutely anything. Even the same type as the list itself, which makes a tree structure.
(See my recent answer:
where're we can find a open source c# tree structure[
^].)
This should answer your question.
—SA