Listing 10

generic <typename T>
public ref class Vector
{
    int length;
/*1*/   array<T>^ vector;
public:
   property int Length
    {
        int get() { return length; }
    private:
        void set(int value) { length = value; }
    }
/*2*/   property T default[int]
    {
        T get(int index) { return vector[index]; }
        void set(int index, T value) { vector[index] = value; }
    }
    Vector(int vectorLength, T initValue)
    {
        Length = vectorLength;
        vector = gcnew array<T>(Length);
        for (int i = 0; i < Length; ++i)
        {
/*3*/           this[i] = initValue;
        }
/*4*/       //for each (T element in vector)
        //{
        //  element = initValue;
        //}
    }
    Vector(int vectorLength)
    {
        Length = vectorLength;
        vector = gcnew array<T>(Length);
        for (int i = 0; i < Length; ++i)
        {
/*5*/           this[i] = T();
        }
    }
    Vector()
    {
        Length = 0;
/*6*/       vector = gcnew array<T>(0);
    }
    ~Vector()       // redundant
    {
/*7*/       vector = nullptr;
    }
    virtual String^ ToString() override
    {
        String^ s = "[";
        int i;
        for (i = 0; i < Length - 1; ++i)
        {
/*8*/           s = String::Concat(s, this[i], ":");
        }
/*9*/       s = String::Concat(s, this[i], "]");
        return s;
    }
    virtual bool Equals(Object^ obj) override
   {
        if (obj == nullptr)
        {
            return false;
        }
        if (this == obj)    // are we testing against ourselves?
        {
            return true;
        }
/*10*/      if (GetType() == obj->GetType())
        {
            Vector<T>^ v = static_cast<Vector^>(obj);
            if (Length != v->Length) // do vectors have different lengths
            {
                return false;
            }
            for (int i = 0; i < Length; ++i)
            {
/*11*/              //if (this[i] != v[i])
                if (this[i]->Equals(v[i]) == false)
                {
                    return false;
                }
            }
            return true;
        }
        return false;
    }
/*12*/  virtual int GetHashCode() override
    {
        return 0; // what to return?
    }
};