鉴于这个虚构的例子:
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
个对象(设计决定,我不能改变它)。
答案 0 :(得分:7)
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
。
答案 1 :(得分:2)
你试过这个吗?
T DoSomething()
{
return this as T;
}
this
与T
并不一致,因此需要像上面的示例一样明确地强制转换它。