I guess my example can be boiled down to this:
class A1
{
public void F1<T>(T t) where T : struct { throw new NotImplementedException(); }
public void F1<T>(T t) where T : class { throw new NotImplementedException(); }
}
and the core question would be why doesn't compiler treat generic for structs and generic for class as different param types. I guess there is no logical explanation, it just doesn't. or am I missing something?