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

È stato utile?

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

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