In C # è possibile sovraccaricare un operatore di cast generico nel modo seguente?
-
06-07-2019 - |
Domanda
Mi chiedo solo se ci sia comunque modo di rappresentare il seguente codice in C # 3.5:
public struct Foo<T> {
public Foo(T item) {
this.Item = item;
}
public T Item { get; set; }
public static explicit operator Foo<U> ( Foo<T> a )
where U : T {
return new Foo<U>((U)a.Item)
}
}
Grazie
Soluzione
Gli operatori di conversione non possono essere generici. Dalla sezione 10.10 delle specifiche, ecco il formato di un operatore di conversione-dichiaratore:
conversion-operator-declarator: implicit operator type ( type identifier ) explicit operator type ( type identifier )
Confronta questo con, diciamo, un metodo-header:
metodo-header : attributiopt metodi-modificatoriopt parziale opt ritorno di tipo nome-membro type-parameter-listopt ( elenco-parametri-formale opt ) tipo-parametro-vincoli-clausole opt
(Mi dispiace per la formattazione - non sono sicuro di come farlo meglio.)
Si noti che il formato dell'operatore non include un elenco di parametri di tipo o vincoli di parametri di tipo.
Altri suggerimenti
Il tuo codice si riduce alla riga: return new Foo<U>((U)a.Item)
Dove si tenta di assegnare una baseclass a una classe ereditata, il che è impossibile.
Supponiamo che T (classe base) sia di tipo Stream
e U di tipo MemoryStream
(classe ereditata), non è possibile assegnare un <=> a una variabile di tipo <=>.
Penso che la risposta breve sia " Non possibile. Prova a utilizzare un metodo anziché & Quot;
Sembra anche essere ingannevole di questa domanda Soluzione per vincolo dell'operatore sovraccarico nei generici .NET