Domanda

Qualcuno può spiegare perché è necessario aggiungere un parametro out o in per indicare che un tipo generico è la variante Co o Contra in C # 4.0?

Ho cercato di capire perché questo è importante e perché il compilatore non può semplicemente capirlo ..

Grazie,

Josh

È stato utile?

Soluzione

Eric Lippert, che lavora alla lingua, ha una serie di post su msdn che dovrebbero aiutare a chiarire i problemi in questione:
http://blogs.msdn.com/ericlippert/ Archivio / tag / covarianza + e + controvarianza / default.aspx

Quando leggi gli articoli mostrati su quel link, inizia dal basso e vai su.

Alla fine arriverai a # 7 (Perché abbiamo bisogno di una sintassi?) .

Altri suggerimenti

In realtà non ne abbiamo bisogno , non più di abstract nelle lezioni o entrambi out e ref. Esistono solo perché noi, come programmatori, possiamo chiarire chiaramente le nostre intenzioni, in modo che il programmatore di manutenzione sappia cosa stiamo facendo e il compilatore può verificare che lo stiamo facendo nel modo giusto.

Bene, il problema principale è che se hai una gerarchia di classi come:

   class Foo { .. } 

   class Bar : Foo { .. } 

E hai un IEnumerator<Bar>, non puoi usarlo come IEnumerator<Foo> anche se sarebbe perfettamente sicuro. In 3.5 questo costringe un gran numero di tiri dolorosi. Questa operazione sarebbe sempre sicura ma viene negata dal sistema di tipi perché non è a conoscenza dell'uso covariante del parametro di tipo generico. Bar può restituire solo un Foo e ogni IEqualityComparer<Foo> è un IEqualityComparer<Bar>.

Allo stesso modo, se avevi un <=> può essere usato per confrontare qualsiasi coppia di oggetti di tipo <=> anche se uno o entrambi sono un <=>, ma non possono essere espressi in un <=> perché non è a conoscenza dell'uso controverso del parametro di tipo generico. <=> consuma solo oggetti di tipo <=> e ogni <=> è un <=>.

Senza queste parole chiave siamo costretti ad assumere che l'argomento generico possa verificarsi sia come argomento di un metodo sia come tipo di risultato di un metodo, quindi non possiamo consentire in modo sicuro nessuna delle conversioni di cui sopra.

Con loro, il sistema di tipi è gratuito per consentirci di effettuare l'upgrade e il downcast in sicurezza tra quelle interfacce nella direzione indicata dalla parola chiave e riceviamo errori che indicano quando violeremmo la disciplina richiesta per garantire tale sicurezza.

Le parole chiave in e out sono state parole chiave dal C # 1.0 e sono state utilizzate nel contesto dei parametri <=> - e <=> - nei metodi.

Covarianza e contraddizione sono vincoli su come si può implementare un'interfaccia. Non c'è un buon modo per inferirli - l'unico modo, penso, è dall'uso, e sarebbe disordinato e alla fine non funzionerebbe.

Jon e Joel hanno entrambi fornito una risposta abbastanza completa a questo, ma la linea di fondo è che non sono tanto necessari da parte del compilatore, ma piuttosto aiutano a garantire la sicurezza dell'implementazione indicando esplicitamente la varianza del parametro. Ciò segue un modello molto simile a quello di richiedere la parola chiave out o ref sia nel sito chiamante che nel sito di dichiarazione.

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