Your statement "assume(can,real);" produces a new variable (can~) and assigns it as the value of can. Your statement "assign(f[1]);" evaluates f[1] as g = x + can~*x*y and then assigns x + can~*x*y as the value of g. Now "can := 2;" assigns the new value 2 to can (removing the assumption), but this doesn't affect the value of g which has already been assigned and contains "can~" rather than "can". So when you try to plot g, it contains an unassigned parameter.
One thing you might do, instead of assigning a value to can (which removes an assumption you said is really important), is to evaluate g at the value can = 2. Thus omit the "can := 2" and try
> plot3d(eval(g, can = 2), x = 0 .. 100, y = 0 .. 100);