为什么我不能将派生泛型类型转换为基于非泛型类型(通过约束)?

Adr*_*tti 3 .net c# generics casting

鉴于这个虚构的例子:

class NonGeneric
{
}

class Generic<T> : NonGeneric
    where T : NonGeneric
{
    T DoSomething()
    {
        return this; // **
    }
}
Run Code Online (Sandbox Code Playgroud)

我期望它编译:Generic<T>派生自NonGeneric并且T必须是派生类,因此它满足其约束.

我应该能够做到这一点:

NonGeneric obj = new Generic<NonGeneric>();
Run Code Online (Sandbox Code Playgroud)

那么这个指令应该没有问题:

return this;
Run Code Online (Sandbox Code Playgroud)

或者至少这个:

return (T)this;
Run Code Online (Sandbox Code Playgroud)

不幸的是它不起作用,上面的例子没有编译错误:

无法将类型转换NonGeneric<T>为' T'

我做错了什么,我看不到它,或者只是不被允许?为什么这个?


如果可能的话,我会避免使用我在本文中描述的任何解决方法(反射,动态编译方法等).我也会避免使用dynamic对象(设计决定,我不能改变它).

The*_*kis 7

thisNonGeneric,TNonGeneric,但this不一定T.从编译器的角度来看,它们可以是不同的子类.

考虑班级:

class Red : NonGeneric
{
}
Run Code Online (Sandbox Code Playgroud)

然后你的泛型类变成:

class Generic<Red> : NonGeneric
    where Red : NonGeneric // constraint satisfied
{
    Red DoSomething()
    {
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,this是不是Red,这是Generic<Red>,这是一个不同的子类NonGenericRed.