4

为什么我只能向上转换一个泛型而不向下转换它?如果我的约束说并且 U 是从有效的 BaseClass 派生
的,编译器怎么不清楚?where T : BaseClass(U)objectOfTypeT

4

2 回答 2

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
于 2010-10-24T08:14:33.090 回答
2

除非我读错了问题,否则您可能会:

class A:BaseClass{}
class B:BaseClass{}

在 T=A 和 U=B 的情况下,两个约束都是满意的,但是从 T 到 U 的强制转换显然是无效的。

如果 U 只是另一个类,那么同样适用;除非您在约束中声明它,否则不知道 T 与 U 位于同一链中(如果有帮助,泛型约束可能涉及其他泛型类型参数)。

于 2010-10-24T08:13:20.143 回答