Microsoft has a detailed write up on the subject but it boils down to the implementation of multiple interfaces/classes which have the same method in them. Implicit no longer works in that context.
class Test 
{
    static void Main()
    {
        SampleClass sc = new SampleClass();
        IControl ctrl = (IControl)sc;
        ISurface srfc = (ISurface)sc;
        // The following lines all call the same method.
        sc.Paint();
        ctrl.Paint();
        srfc.Paint();
    }
}
interface IControl
{
    void Paint();
}
interface ISurface
{
    void Paint();
}
class SampleClass : IControl, ISurface
{
    // Both ISurface.Paint and IControl.Paint call this method.  
    public void Paint()
    {
        Console.WriteLine("Paint method in SampleClass");
    }
}
// Output: 
// Paint method in SampleClass 
// Paint method in SampleClass 
// Paint method in SampleClass
If we were to take the explicit approach, we end up with this.
public class SampleClass : IControl, ISurface
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}
It all boils down to providing uniqueness when the implemented types clash. In your example, Foo is IFoo.