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.
class Foo
Console.WriteLine("This is Non-generic Foo class");
Foo fooNonGenericInstance;
fooNonGenericInstance = new Foo();
fooNonGenericInstance.FooMethod();