Variance only works for reference-types (or there is an identity conversion). It is not known that TBase is reference type, unless you add : class:
public void Foo<TBase>() where TBase : class, IBase
since I could write a:
public struct Evil : IBase {}