I have been wondering how Microsoft might add generics to the MS .NET Framework (hopefully by 2.0). And I was wondering how they would maintain source code compatibility with something like ArrayList while adding ArrayList<T>. I tried a simple experiment with a brain dead stack class (both parameterized and not) and I get the following error with the Gyro- ized Rotor csc compiler:
error CS0104: 'Stack' is an ambiguous reference The code is listed below. It seems odd that the compiler would find a reference to Stack as ambiguous (can't tell if I want Stack or Stack<int>). Should this work and the compiler just doesn't handle it correctly yet or not? Here is the code: namespace Collections { public class Stack { private object[] m_stack; private int m_ndx = 0; private const int s_size = 50; public Stack() { m_stack = new object[s_size]; } public void Push(object obj) { if (m_ndx >= (s_size - 1)) { throw new System.Exception("Stack overflow"); } m_stack[m_ndx++] = obj; } public object Pop() { if (m_ndx == 0) throw new System.Exception("Stack underflow"); return m_stack[--m_ndx]; } } } namespace TemplatedCollections { public class Stack<T> { private T[] m_stack; private int m_ndx = 0; private const int s_size = 50; public Stack() { m_stack = new T[s_size]; } public void Push(T item) { if (m_ndx >= (s_size - 1)) { throw new System.Exception("Stack overflow"); } m_stack[m_ndx++] = item; } public T Pop() { if (m_ndx == 0) throw new System.Exception("Stack underflow"); return m_stack[--m_ndx]; } } } namespace Acme { using System; using Collections; using TemplatedCollections; class App { public static void Main() { Stack s1 = new Stack(); // CSC error here s1.Push(1); s1.Push(4); s1.Push((int)s1.Pop() + (int)s1.Pop()); Console.WriteLine(s1.Pop()); Stack<int> s2 = new Stack<int>(); s2.Push(1); s2.Push(4); s2.Push(s2.Pop() + s2.Pop()); Console.WriteLine(s2.Pop()); } } }