在C#3.5中向下转换泛型类型

时间:2010-10-24 08:09:47

标签: c# .net generics downcast

为什么我只能翻译一个通用而不是贬低它? 如果我的约束说where T : BaseClass并且U是从BaseClass派生的(U)objectOfTypeT是否有效,编译器怎么也不清楚?

2 个答案:

答案 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在同一个链中(泛型约束可能涉及其他泛型类型参数,如果有帮助的话)。

相关问题