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.