[英]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>
派生自NonGeneric
, T
必须是派生类,因此它满足其约束。
我应该能够做到这一点:
NonGeneric obj = new Generic<NonGeneric>();
那么这个指令应该没问题:
return this;
或者至少这个:
return (T)this;
不幸的是它不起作用,上面的例子没有编译错误:
无法将
NonGeneric<T>
类型转换为'T
'
我做错了什么,我看不到它,或者只是不被允许? 为什么这个?
如果可能的话,我会避免使用我在本文中描述的任何解决方法(反射,动态编译方法等)。 我也会避免dynamic
对象(设计决定,我不能改变它)。
this
就是NonGeneric
, T
的NonGeneric
,但是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;
}
this
与T
不一样,因此需要在上面的示例中明确地强制转换它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.