Please have a look at the following code. Why do I get a compile-error?
I don't get it!
Casting is a way of telling the compiler that I know more about the objects than it does. And in this case, I know for fact, that "x" does actually contain an instance of "SomeClass". But the compiler seems to be unwilling to accept that information.
https://dotnetfiddle.net/0DlmXf
public class StrangeConversion 
{
    public class SomeClass { }
    public interface ISomeInterface { }
    public class Implementation : SomeClass, ISomeInterface { }
    public void Foo<T>() where T : class 
    {
        T x = (T)Factory();
        //Compile-error: Cannot convert type 'T' to 'SomeClass'
        SomeClass a = (SomeClass)x;
        //This is perfectly fine:
        SomeClass b = (SomeClass)(object)x;
        if (x is SomeClass c) 
        {
            //This works as well and 'c' contains the reference.
        }
    }
    private object Factory() 
    {
        return new Implementation();
    }
}
Edit: @Charles Mager has the correct answer in the comment: There does not seem to be a valid reason. The language designers just didn't want to allow this cast.
 
     
     
    