Perché non è possibile eseguire il cast di un'istanza di un delegato in un tipo generico T
?Impossibile trasmettere delegato a un tipo generico T
consideri un metodo di utilità CreateDelegate
che crea un'istanza di T, che è una delegato, cioè un tipo derivato da MulticastDelegate
.
T CreateDelegate<T>() {… }
Purtroppo i farmaci generici non permette a vincolo T
ad un tipo derivato da MulticastDelegate
dando il seguente errore di compilazione:
Constraint cannot be special class 'System.MulticastDelegate'
Tuttavia, questo metodo di utilità sta controllando che T
è compatibile con MulticastDelegate
e creazione di un delegato tramite Reflection tramite Delegate::CreateDelegate
. Ma, se cerchiamo di lanciare il risultato di Delegate::CreateDelegate
a T
, avremo il seguente errore di compilazione:
Cannot convert type 'System.Delegate' to 'T'
Tuttavia, se io scaccio prima a object
e poi a T
funzionerà bene:
T h = (T) ((object) Delegate.CreateDelegate(typeof(T), target, m));
Perché non possiamo inoltrare direttamente il delegato a T?
funziona così: '' T h = Delegate.CreateDelegate (typeof (T), target, m) come T; ''? –
Sì, funziona. E, ha ancora meno senso. IMHO il comportamento di entrambi gli operatori ('as' e _cast_) dovrebbe essere coerente. –
in questo modo è più sicuro che lanciare l'oggetto quindi da oggetto a T, ti darà null se cast fallisce –