4

ジェネリックのみをアップキャストでき、ダウンキャストできないのはなぜですか?
私の制約が言っていて、Uが有効なwhere T : BaseClassBaseClassから派生している場合、コンパイラにどのように明確ではありませんか?(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 に答える