为什么我只能翻译一个通用而不是贬低它?
如果我的约束说where T : BaseClass
并且U是从BaseClass派生的(U)objectOfTypeT
是否有效,编译器怎么也不清楚?
答案 0 :(得分:5)
因为它可能无效。考虑一下:
class Base { }
class A : Base { }
class B : Base { }
A temp1 = new A();
B temp2 = (B)temp1; // not valid
仅仅因为它们共享相同的基类并不意味着你可以将一个类型转换为另一个。
请注意,您可以使用as
运算符来解决此问题:
var result = objectOfTypeT as U; // this does not give any compilation error
// but will result in a null reference if
// objectOfTypeT cannot be converted to U
答案 1 :(得分:2)
除非我读错了这个问题,否则你可以:
class A:BaseClass{}
class B:BaseClass{}
当T = A且U = B时,两个约束都很满意,但从T到U的转换显然无效。
如果U只是另一个类,那么仍然适用;除非你在约束中声明它,否则不知道T与U在同一个链中(泛型约束可能涉及其他泛型类型参数,如果有帮助的话)。