Domanda

Perché posso solo girare un generico e non abbattere?
Come non è chiaro al compilatore che se il mio vincolo dice where T : BaseClass e u è derivato da Baseclass che (U)objectOfTypeT è valido?

È stato utile?

Soluzione

Perché potrebbe non essere valido. Considera questo:

class Base { }
class A : Base { }
class B : Base { }

A temp1 = new A();
B temp2 = (B)temp1; // not valid

Solo perché condividono la stessa classe di base non significa che puoi digitare l'una all'altra.

Nota che puoi aggirare questo usando il as operatore:

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

Altri suggerimenti

A meno che non legga la domanda sbagliata, potresti avere:

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

Con T = A e U = B, entrambi i vincoli sono felici, ma il cast da T a U è chiaramente non valido.

Se sei solo un'altra classe, allora lo stesso vale ancora; La T non è nota per essere nella stessa catena di U a meno che non lo dichiari nei vincoli (i vincoli generici possono coinvolgere altri argomenti di tipo generico, se aiuta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top