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

时间:2014-01-29 13:12:16

标签: c# .net generics casting

鉴于这个虚构的例子:

class NonGeneric
{
}

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

我希望它可以编译:{{1​​}}派生自Generic<T>NonGeneric必须是派生类,因此它满足其约束。

我应该可以这样做:

T

然后这条指令应该没有问题:

NonGeneric obj = new Generic<NonGeneric>();

或者至少这个:

return this;

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

  

无法将return (T)this; 类型转换为“NonGeneric<T>

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


如果可能的话,我会避免像我描述的in this post(反射,动态编译方法等)那样的解决方法。我也会避免T个对象(设计决定,我不能改变它)。

2 个答案:

答案 0 :(得分:7)

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

考虑课程:

class Red : NonGeneric
{
}

然后你的通用类变为:

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

this不是Red,而是Generic<Red>,它是NonGeneric的不同子类,而不是Red

答案 1 :(得分:2)

你试过这个吗?

T DoSomething()
{
    return this as T;
}

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