繁体   English   中英

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

[英]Why I cannot cast derived generic type to base non-generic type (through a constrain)?

鉴于这个虚构的例子:

class NonGeneric
{
}

class Generic<T> : NonGeneric
    where T : NonGeneric
{
    T DoSomething()
    {
        return this; // **
    }
}

我希望它编译: Generic<T>派生自NonGenericT必须是派生类,因此它满足其约束。

我应该能够做到这一点:

NonGeneric obj = new Generic<NonGeneric>();

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

return this;

或者至少这个:

return (T)this;

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

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

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


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

this就是NonGenericTNonGeneric ,但是this并不一定是T 从编译器的角度来看,它们可以是不同的子类。

考虑班级:

class Red : NonGeneric
{
}

然后你的泛型类变成:

class Generic<Red> : NonGeneric
    where Red : NonGeneric // constraint satisfied
{
    Red DoSomething()
    {
        return this;
    }
}

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

你试过这个吗?

T DoSomething()
{
    return this as T;
}

thisT不一样,因此需要在上面的示例中明确地强制转换它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM