I was suprised when found that the following code throws exception at runtime:
class A
{
    public string Name { get; set; }
    public A()
    {
        Name = "Class A";
    }
}
class B
{
    public string Name { get; set; }
    public B()
    {
        Name = "Class B";
    }
    public static explicit operator A(B source)
    {
        return new A() {Name = source.Name};
    }
}
class Program
{
    static void Main(string[] args)
    {
        // This executes with no error
        var bInstance = new B();
        Console.WriteLine(bInstance.GetType()); // <assemblyname>.B
        var aInstance = (A) bInstance;
        Console.WriteLine(aInstance.Name); // Class B
        // This fails with InvalidCastException
        var bInstanceReflection = Activator.CreateInstance(typeof (B));
        Console.WriteLine(bInstanceReflection.GetType()); // <assemblyname>.B
        var aInstanceReflection = (A) bInstanceReflection;
        Console.WriteLine(aInstanceReflection.Name);
    }
}
Could anyone tell me why? I don't really understand what happened