An explanation of implicit and explicit conversion in C#