This is not a compiler constraint - it is a language constraint (and quite possibly the CLR, I'm not sure).
These are mostly conflicting overloads - this is similar to trying to overload by return type. It is not supported.
You can declare methods so that these calls are compiled for calls to different methods:
a.Do<int>();
a.Do<string>();
a.Do<int?>();
... / , horrible.
, , , "arity" ( ):
public void Foo() {}
public void Foo<T>() {}
public void Foo<T1, T2>() {}