int, float, double  keywords are just syntactic sugar. The compiler maps them to value types like Int32, Float, Double etc (which are structs). Generally you can't force a type T to be a only a primitive type but you can impose T to be a value type by doing:
class A<T>
  where T : struct
{
   void foo()
   {
      int x = 0;
      T y = (T)Convert.ChangeType(x, typeof(T));  
   }
}
Please note that you still need to use Convert.ChangeType as pointed out by Random832. Imposing the type T to be a struct is only to exclude classes (which are not value types). It's not a great advantage but I think it's cleaner.
There is a similar question here anyway. 
hope it helps.