Same name for a generic and non-generic class


 


I was writing a sample to do something and I noticed that when I declare and instantiate a generic class, I had to pass the generic type in two places:


1.  Foo<Int32> fooGenericInstance;


2.  FooGenericInstance = new Foo<Int32>();


 


First I was not sure why I had to pass the type is two places. After some pondering I came to the following conclusion.


 


namespace Sample


{


    using System;


    class Foo<T>


    {


        public Foo() { }


        public void FooMethod()


        {


            Console.WriteLine(“This is generic Foo class”);


        }


    }


    public class Bar


    {


        static public void Main()


        {


            Foo<Int32> fooGenericInstance;


            fooGenericInstance = new Foo<Int32>();


            fooGenericInstance.FooMethod();


        }


    }


}


 


C# allows you have the same name for a generic and non-generic class. So you can write code such as below which has two types essentially which are Foo and Foo<T>. Now you have to make it very explicit both during instantiation and construction the class and constructor you are referring to. Thus you end up passing the type T in two places.


 


namespace Sample


{


    using System;


    class Foo<T>


    {


        public Foo() { }


        public void FooMethod()


        {


            Console.WriteLine(“This is generic Foo class”);


        }


    }


    class Foo


    {


        public Foo() { }


 


        public void FooMethod()


        {


            Console.WriteLine(“This is Non-generic Foo class”);


        }


 


        static public void Main()


        {


            Foo fooNonGenericInstance;


            Foo<Int32> fooGenericInstance;


 


            fooNonGenericInstance = new Foo();


            fooGenericInstance = new Foo<Int32>();


 


            fooNonGenericInstance.FooMethod();


            fooGenericInstance.FooMethod();


        }


    }


}