Why? Simple: because you have no parameters, the decision as to what type to call your method with is decided at compile time - the type cannot be inferred from the usage. Which mean you have to provide a constant type specifier, rather than a method call.
Instead, try this:
private void DoSomething<T>()
{
Console.WriteLine("DoSomething:" + typeof(T));
}
private void DoSomething<T>(T x)
{
Console.WriteLine("DoSomething:" + x.GetType());
}
Then you can call it:
DoSomething<int>();
DoSomething<float>();
double d = 12.34;
DoSomething(d);
And get what you want:
DoSomething:System.Int32
DoSomething:System.Single
DoSomething:System.Double