Interfaces can’t be instantiated by definition. You always instantiate a concrete class.
So in both statements your instance is actually of type UnityContainer.
The difference is for the first statement, as far as C# is concerned, your container is something that implements IUnityContainer, which might have an API different from UnityContainer.
Consider:
interface IAnimal
{
void die();
}
class Cat : IAnimal
{
void die() { ... }
void meow() { ... }
}
Now :
IAnimal anAnimal = new Cat();
Cat aCat= new Cat();
C# knows for sure anAnimal.die() works, because die() is defined in IAnimal. But it won’t let you do anAnimal.meow() even though it’s a Cat, whereas aCat can invoke both methods.
When you use the interface as your type you are, in a way, losing information.
However, if you had another class Dog that also implements IAnimal, your anAnimal could reference a Dog instance as well. That’s the power of an interface; you can give them any class that implements it.