Yuck. But not strictly your fault it's yuck.
return Convert.ToDouble(t) * Convert.ToDouble(f1) as Tresult;
You can't use
as Tresult
because Tresult could be any type, and it doesn't know if there is a conversion. You could constrain the types of Tresult to be compatible with T and / or F, but that also is a messy job.
return (Tresult) (Convert.ToDouble(t) * Convert.ToDouble(f1));
You can't cast it because it tries to find a direct conversion from an unspecified type. Nasty.
return (Tresult) (object) (Convert.ToDouble(t) * Convert.ToDouble(f1));
You can get it to compile by doing a double cast via object (since anything can be cast to an object, and everything is derived from object).
Will it work reliably in practice? Probably not. Best guess is run time exceptions because of the lack of conversions. It may work if you are really careful what types you use, but...
I would avoid having such flexible generic methods, if only because they are a real PITA to test fully.